首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在gson的fromJson和toJson方法中使用XmlGregorianCalendar?

如何在gson的fromJson和toJson方法中使用XmlGregorianCalendar?
EN

Stack Overflow用户
提问于 2011-10-11 19:18:23
回答 2查看 12.9K关注 0票数 2

我的项目的主题是给出数据的XML格式,并使用google-gson获得Json格式,我让JAXB从XML schema生成java POJO,其中我有一个XMLGregorianCalendar数据类型的变量。

我给出了下面的XML输入,并从gson.toJson()方法获得了json格式;

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<EmpRequest xmlns="http://java.com/Employee">
<EmplIn>
<EmpID>12</EmpID>
<Empname>sara</Empname>
<Designation>SA</Designation>
<DOJ>2002-05-30T09:30:10+06:00</DOJ>
</EmplIn>
</EmpRequest>

但在输出中,我得到了以下内容。

代码语言:javascript
运行
复制
{"emplIn":{"empID":"12","empname":"sara","designation":"SA","doj":{}}}

我在google上冲浪,得到的建议是添加xml schema并使用字符串更改XmlGregorianCalendar数据类型。但我不想从这两种方式来实现它。

我的意思是如何通过gson的fromJson和toJson方法获得XmlGregorianCalendar数据类型的正确输出?

太感谢你了哈里什·拉杰。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-11 23:33:00

注意:我是的负责人,也是专家组的成员。

您可以使用MOXy来处理这个用例中的XML和JSON绑定方面。正如我在评论中提到的,MOXy支持XMLGregorianCalendar类型。元数据将如下所示:

EmpRequest

代码语言:javascript
运行
复制
package forum7725188;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="EmpRequest")
@XmlAccessorType(XmlAccessType.FIELD)
public class EmpRequest {

    @XmlElement(name="EmplIn")
    private EmplIn emplIn;

}

EmplIn

代码语言:javascript
运行
复制
package forum7725188;

import javax.xml.bind.annotation.*;
import javax.xml.datatype.XMLGregorianCalendar;

@XmlAccessorType(XmlAccessType.FIELD)
public class EmplIn {

    @XmlElement(name="EmpID")
    private long empId;

    @XmlElement(name="Empname")
    private String name;

    @XmlElement(name="Designation")
    private String designation;

    @XmlElement(name="DOJ")
    private XMLGregorianCalendar doj;

}

package-info

代码语言:javascript
运行
复制
@XmlSchema(namespace="http://java.com/Employee", elementFormDefault=XmlNsForm.QUALIFIED)
@XmlAccessorType(XmlAccessType.FIELD)
package forum7725188;

import javax.xml.bind.annotation.*;

演示

通过将eclipselink.media-type属性设置为application/json,可以将Marshaller的MOXy实现配置为输出JSON。

代码语言:javascript
运行
复制
package forum7725188;

import java.io.File;   
import javax.xml.bind.*;
import javax.xml.namespace.QName;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(EmpRequest.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum7725188/input.xml");
        EmpRequest empRequest = (EmpRequest) unmarshaller.unmarshal(xml);

        JAXBElement<EmpRequest> jaxbElement = new JAXBElement<EmpRequest>(new QName(""), EmpRequest.class, empRequest);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.marshal(jaxbElement, System.out);
    }

}

input.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<EmpRequest xmlns="http://java.com/Employee">
    <EmplIn>
        <EmpID>12</EmpID>
        <Empname>sara</Empname>
        <Designation>SA</Designation>
        <DOJ>2002-05-30T09:30:10+06:00</DOJ>
    </EmplIn>
</EmpRequest>

输出

代码语言:javascript
运行
复制
{"EmplIn" : 
   {"EmpID" : "12",
   "Empname" : "sara",
   "Designation" : "SA",
   "DOJ" : "2002-05-30T09:30:10+06:00"}}

有关详细信息的,请访问

票数 2
EN

Stack Overflow用户

发布于 2011-11-11 19:21:16

希望这能解决我使用google-gson的问题。

(应该在创建Gson对象的位置添加以下内容)

步骤1:

代码语言:javascript
运行
复制
    Gson gson =
        new GsonBuilder().registerTypeAdapter(XMLGregorianCalendar.class,
                                              new XGCalConverter.Serializer()).registerTypeAdapter(XMLGregorianCalendar.class,
                                                                                                   new XGCalConverter.Deserializer()).create();

步骤2:我们需要创建XGCalConverter类,如下所示。

代码语言:javascript
运行
复制
 import com.google.gson.JsonDeserializationContext;
 import com.google.gson.JsonDeserializer;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonPrimitive;
 import com.google.gson.JsonSerializationContext;
 import com.google.gson.JsonSerializer;

 import java.lang.reflect.Type;

 import javax.xml.datatype.DatatypeFactory;
 import javax.xml.datatype.XMLGregorianCalendar;

  public class XGCalConverter
  {
   public static class Serializer implements JsonSerializer
   {
    public Serializer()
    {
     super();
    }

    public JsonElement serialize(Object t, Type type,
                             JsonSerializationContext jsonSerializationContext)
    {
     XMLGregorianCalendar xgcal=(XMLGregorianCalendar)t;
     return new JsonPrimitive(xgcal.toXMLFormat());
    }
  }
    public static class Deserializer implements JsonDeserializer
    {

      public Object deserialize(JsonElement jsonElement, Type type,
                               JsonDeserializationContext jsonDeserializationContext)
      {
          try
           {
              return DatatypeFactory.newInstance().newXMLGregorianCalendar(jsonElement.getAsString());
           }
           catch(Exception ex)
           {
               ex.printStackTrace();
               return null;
           }
         }
       }
     }
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7725188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档