Jaxb 如何将XmlGregorianCalendar与gson的fromJson和toJson方法一起使用?

Jaxb 如何将XmlGregorianCalendar与gson的fromJson和toJson方法一起使用?,jaxb,gson,Jaxb,Gson,我的项目的主题是给出数据的XML格式,并使用google gson获取Json格式,我让JAXB从XML模式生成java POJO,其中我有一个XMLGregorianCalendar数据类型的变量 我提供以下XML输入,并从gson.toJson()方法获取json格式 我在google上冲浪,得到了添加xml模式并用字符串更改XmlGregorianCalendar数据类型的建议。但我不想从两方面都达到目的 我的意思是,如何通过gson的fromJson和toJson方法获得XmlGrego

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

我提供以下XML输入,并从gson.toJson()方法获取json格式

我在google上冲浪,得到了添加xml模式并用字符串更改XmlGregorianCalendar数据类型的建议。但我不想从两方面都达到目的

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

非常感谢你,
Harish Raj.

注意:我是专家组的负责人和成员

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

EMP请求

package forum7725188;

import javax.xml.bind.annotation.*;

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

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

}
{"EmplIn" : 
   {"EmpID" : "12",
   "Empname" : "sara",
   "Designation" : "SA",
   "DOJ" : "2002-05-30T09:30:10+06:00"}}
EmplIn

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;

}
套餐信息

@XmlSchema(namespace="http://java.com/Employee", elementFormDefault=XmlNsForm.QUALIFIED)
@XmlAccessorType(XmlAccessType.FIELD)
package forum7725188;

import javax.xml.bind.annotation.*;
演示

@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

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);
    }

}
了解更多信息

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;

}

希望这能解决我的使用问题

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

步骤1:

    Gson gson =
        new GsonBuilder().registerTypeAdapter(XMLGregorianCalendar.class,
                                              new XGCalConverter.Serializer()).registerTypeAdapter(XMLGregorianCalendar.class,
                                                                                                   new XGCalConverter.Deserializer()).create();
步骤2:我们需要创建XGCalConverter类,如下所示

{"emplIn":{"empID":"12","empname":"sara","designation":"SA","doj":{}}}
 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;
           }
         }
       }
     }

您可以使用EclipseLink JAXB(MOXy)将对象转换为XML和JSON。如果您对这种方法感兴趣,请告诉我:是的,Blaise,我很想知道它是否适用于XMLGregoriacalendar数据类型。Blaise,您能否用一个示例进一步解释一下,以便我能够实现它?我对你提供的如何实施感到困惑(我已经添加了一个答案,演示了如何使用MOXy来实现您的用例。非常感谢您,Blaise。但是听起来我需要GAXB生成的Java POJO用于获取我的应用程序的其他资源。是否有可能将它与GAXB生成的POJO一起使用?@harish.raj-By
GAXB
您的意思是
JAXB
?如果是,那么是的。就JAXB运行时而言,生成的类和您自己注释的类之间没有真正的区别。Blaise,我使用Jdeveloper。我得到以下错误。线程“main”中的异常javax.xml.bind.PropertyException:name:eclipselink.media-type value:application/json位于org.eclipse.persistence.jaxb.JAXBMarshaller.setProperty(JAXBMarshaller.java:520)位于com.moxy.employee.Test.main(Test.java:18)您能告诉我如何安装/配置eclipselink jaxb(moxy)吗所以它可以正常工作。@harish.raj-您需要使用EclipseLink 2.4。您可以从以下位置获得里程碑版本:我也遇到了这个异常,但我使用的是2.4.0-SNAPSHOT。有什么建议吗?这个方法将我的序列化纪元时间用引号括起来。有没有想法将它们作为工作数字?