【Java】Jackson解析xml的坑

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

剛用的時候心裏是狂喜的,終於不用本身解析了…………web

 but…………………………仍是有坑的……spring

坑一:大小寫問題api

@JacksonXmlProperty(localName = "Apid")mvc

private Integer Apid;app

private Integer getApid()this

{xml

    return this.Apidblog

}get

把註解放在成員變量上面,會解析出兩個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就行了

相關文章
相關標籤/搜索