【Java】Jackson解析xml的坑


為了獲取xml數據,在spring mvc中針對 @ResponseBody配置了jackson。

剛用的時候內心是狂喜的,終於不用自己解析了…………

 but…………………………還是有坑的……

坑一:大小寫問題

@JacksonXmlProperty(localName = "Apid")

private Integer Apid;

private Integer getApid()

{

    return this.Apid

}

把注解放在成員變量上面,會解析出兩個apid字段,一個是<Apid></Apid>,另一個是<apid><apid>

這是因為Jackson的處理機制會自動從屬性方法上獲取成員變量名,然而在java中,要么以駝峰命名,要么前兩個字母都大寫,才能用get方法正確地獲取屬性,所以使用getApid獲取的成員名稱就是apid,被jackson解析了出來。又因為成員變量上也加了注解,所以也會被解析。這就造成了xml文件生成了兩個apid標簽。正確的做法是把注解寫到get方法上面

正確寫法:

private Integer Apid;

@JacksonXmlProperty(localName = "Apid")

private Integer getApid()

{

    return this.Apid

}

 

坑二:Jackson封裝list問題

這個問題排查的時候異常困難……開始以為是封裝的問題…………(吐槽一下,這個外包項目使用大量xml交互,但是又用不了webservice就得按照固定格式解析封裝xml.....改動也賊困難。。。)……最后還是確定了是jackson的問題

private List<Integer> APID;

@JacksonXmlProperty(localName = "APID")
@JacksonXmlElementWrapper(useWrapping = false)
public List<Integer> getAPID() {
return APID;
}

開始APID這個list一直被包裝了兩層!正確結果應該是<APID>111</APID>

但是得到的是<APID><APID>111</APID></APID>

問題出在JacksonXmlElementWrapper……………………如果不指定的話這個值默認是true………………………………………………………………………………………………

為true的時候Jackson封裝xml直接用xmlProperty的localName又封了一層…

把這里改成false就好了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM