2017-05-07 32 views
0

我試圖從XSD-> POJO-> JSON中使用UPS區分大小寫的UPS跟蹤API。我使用傑克遜2.6.7在生成的JSON中。我看到駱駝的名字時,我應該看到如下:Jackson在編組時忽略了XmlElement名稱/案例JSON

"TrackRequest": { "InquiryNumber": "1Z12345E6205277936" }

生成的Java bean是註釋,像這樣:

@XmlElement(name = "TrackRequest") 
protected TrackRequest trackRequest; 

我試過幾個映射功能設置,如USE_WRAPPER_NAME_AS_PROPERTY_NAME和USE_STD_BEAN_NAMING這似乎沒有所需的結果。

我產生JSON像這樣:

ObjectMapper mapper = new ObjectMapper(); 
String jsonRequest = mapper.writeValueAsString(upsRequest); 

的upsRequest豆看起來是這樣的:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "upsSecurity", 
    "trackRequest" 
}) 
@XmlRootElement(name = "Request") 
public class Request { 

    @XmlElement(name = "UPSSecurity") 
    protected UPSSecurity upsSecurity; 
    @XmlElement(name = "TrackRequest") 
    protected TrackRequest trackRequest; 

    /** 
    * Gets the value of the upsSecurity property. 
    * 
    * @return 
    *  possible object is 
    *  {@link UPSSecurity } 
    *  
    */ 
    public UPSSecurity getUPSSecurity() { 
     return upsSecurity; 
    } 

    /** 
    * Sets the value of the upsSecurity property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link UPSSecurity } 
    *  
    */ 
    public void setUPSSecurity(UPSSecurity value) { 
     this.upsSecurity = value; 
    } 

    /** 
    * Gets the value of the trackRequest property. 
    * 
    * @return 
    *  possible object is 
    *  {@link TrackRequest } 
    *  
    */ 
    public TrackRequest getTrackRequest() { 
     return trackRequest; 
    } 

    /** 
    * Sets the value of the trackRequest property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link TrackRequest } 
    *  
    */ 
    public void setTrackRequest(TrackRequest value) { 
     this.trackRequest = value; 
    } 

} 

根據該文件,我應該得到所需的輸出,除非我丟失東西

+1

您可以隨時嘗試添加JSON註釋,例如, '@JsonProperty( 「TrackRequest」)'。如果它在現場不起作用,請嘗試使用getter方法。 – Andreas

+0

我之前給出了一個嘗試,它確實創建了所需的屬性,但其他不需要的屬性仍然創建。 –

回答

2

默認情況下不支持JAXB註釋。您需要添加jackson-module-jaxb-annotations模塊,然後將其註冊到ObjectMapper

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new JaxbAnnotationModule()); 
+0

這工作。 ObjectMapper現在命名屬性完全如何在註釋中指定,沒有配置其他功能。 –

+0

後續操作:在響應XSD中,我定義了一個複雜類型,但在JSON響應中,屬性以空字符串的形式出現。有配置功能來處理,或者我應該修改我的XSD? –

+0

自從我使用過XSD以來,它已經有一段時間了,所以我不太清楚你在說什麼。但要注意的一點是,Jackson不支持所有JAXB註釋。見[this](http://fasterxml.github.io/jackson-module-jaxb-annotations/javadoc/2.2。0/COM/fasterxml /傑克遜/模塊/ JAXB/JaxbAnnotationIntrospector.html) –

0

正如評論中所述,將@JsonProperty添加到字段中。

它正常工作對我來說,使用傑克遜2.7.0:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { "trackRequest" }) 
@XmlRootElement(name = "Request") 
class Request { 

    @XmlElement(name = "TrackRequest") 
    @JsonProperty("TrackRequest") 
    private TrackRequest trackRequest; 

    public Request() { 
    } 
    public Request(TrackRequest trackRequest) { 
     this.trackRequest = trackRequest; 
    } 
} 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { "inquiryNumber" }) 
class TrackRequest { 

    @XmlElement(name = "InquiryNumber") 
    @JsonProperty("InquiryNumber") 
    private String inquiryNumber; 

    public TrackRequest() { 
    } 
    public TrackRequest(String inquiryNumber) { 
     this.inquiryNumber = inquiryNumber; 
    } 
} 

測試

Request upsRequest = new Request(new TrackRequest("1Z12345E6205277936")); 
Marshaller marshaller = JAXBContext.newInstance(Request.class).createMarshaller(); 
marshaller.setProperty("jaxb.formatted.output", Boolean.TRUE); 
marshaller.marshal(upsRequest, System.out); 
ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(SerializationFeature.INDENT_OUTPUT); 
mapper.writeValue(System.out, upsRequest); 

輸出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Request> 
    <TrackRequest> 
     <InquiryNumber>1Z12345E6205277936</InquiryNumber> 
    </TrackRequest> 
</Request> 
{ 
    "TrackRequest" : { 
    "InquiryNumber" : "1Z12345E6205277936" 
    } 
} 

XML和JSON輸出使用PascalCase

+0

這個工作,我沒有得到與此註釋所需的輸出,但我更喜歡堅持我熟悉的JAXB註釋。 –