2011-10-11 69 views
2

我的項目的主題是提供XML格式的數據並使用google-gson獲取Json格式,並且我有JAXB從XML架構生成Java POJO,其中我有一個XMLGregorianCalendar數據類型的變量。如何將XmlGregorianCalendar與fromJson和toson方法一起使用?

我給出了XML的以下輸入,並從gson.toJson()方法獲取json格式;

<?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> 

但在輸出中,我得到了以下內容。

{"emplIn":{"empID":"12","empname":"sara","designation":"SA","doj":{}}} 

我上網谷歌和添加了在XML模式和改變的XMLGregorianCalendar數據類型與串的建議。但我不想從兩個方面實現它。

我的意思是如何通過fromJson和toson方法得到與XmlGregorianCalendar數據類型正確的輸出gson的方法?

非常感謝, Harish Raj。

+0

您可以使用EclipseLink JAXB(MOXy)將對象轉換爲XML和JSON,或者將對象轉換爲XML和JSON。讓我知道如果你對這種方法感興趣:http://blog.bdoughan.com/2011/08/binding-to-json-xml-geocode-example.html –

+0

YEs,布萊斯,我很想如果它的作品對於帶有XmlGregorianCalendar數據類型的。 –

+0

布萊斯,你能否用一個例子來解釋我,以便我可以實現它?我很困惑如何實現它提供的。 :( –

回答

2

備註:我是EclipseLink JAXB (MOXy)的領導和JAXB 2 (JSR-222)專家組的成員。

您可以使用MOXy來處理此用例的XML和JSON綁定方面。正如我在我的評論中提到的,MOXy支持XMLGregorianCalendar類型。元數據看起來像:

EmpRequest

package forum7725188; 

import javax.xml.bind.annotation.*; 

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

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

} 

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.*; 

演示

您可以通過設置eclipselink.media-type屬性爲application/json配置莫西實施Marshaller輸出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); 
    } 

} 

輸入。XML

<?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> 

輸出

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

更多信息

+0

非常感謝Blaise,但是聽起來我需要GAXB生成的Java Pojos來獲取我的應用程序的其他資源。任何可能使用它與GAXB生成Pojos? –

+0

@ harish.raj - 通過'GAXB'你的意思是'JAXB'?如果是,那麼是的。你生成的類或類之間沒有真正的區別你自己到目前爲止作爲JAXB運行時間而言, –

+0

Blaise,我使用Jdeveloper,並且出現以下錯誤: 線程「main」中的異常javax.xml.bind.PropertyException:name:eclipselink.media-value:application/json \t at org.eclipse.persistence.jaxb.JAXBMarshaller.setProperty(JAXBMarshaller.java:520) \t at com.moxy.employee.Test.main(Test.java:18) 你能告訴我如何安裝/配置EclipseLink JAXB(MOXy),以便它能正常工作。 –

8

希望,這可以解決我的使用google-gson的問題。

Gson gson = 
     new GsonBuilder().registerTypeAdapter(XMLGregorianCalendar.class, 
               new XGCalConverter.Serializer()).registerTypeAdapter(XMLGregorianCalendar.class, 
                            new XGCalConverter.Deserializer()).create(); 

步驟2::

步驟1(以下應該在我們創建GSON的對象被添加)我們需要創建XGCalConverter類如像下面這樣。

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; 
      } 
     } 
     } 
    } 
+0

這種方法使我的序列化紀元時間包裹在引號中。任何想法讓他們成爲工作數字? – osoblanco

相關問題