以前解析json用的慣的就是Google的gson了,用慣了基本就用它了,一直也沒發現什么大問題,因為都是解析簡單的json數據。但是最近學習springboot,要解析一個比較復雜的json數據。就照之前的用gsonformat自動生成實體類,讓gson直接解析,本想着一切ok了,可是確報錯了,剛開始以為gsonformat生成的類有錯誤,因為畢竟json數據較為復雜,於是多生成幾次,可是還是不行。面對這樣復雜的數據,我可不想手動寫實體類,於是想着又換了自動生成實體類的工具,可是結果還是未能如願。於是想着能從錯誤的日志中發現點什么,可是無奈gson沒有打印具體的出錯的地方,后來搗鼓了好久,想着不如換個解析工具吧。於是上網找了找,覺得Jackson不錯,趕緊試用,發現還真不錯,雖然也沒能解析成功,但是它打印出了詳細的出錯信息,照着出錯的信息改了馬上就解析成功了。
說說出錯的原因:平時解析json呢基本接口提供的json都是很明確的,所以用gson解析一般不會有啥大問題。但是此次情況不同,接口的數據我無法完全的預知,所以實體類字段有可能不完整。所以當返回的json數據里包含了實體類沒有的字段時gson就有可能出錯,但是對於這種情況用gson解析我是沒找到相應的解決辦法,如果誰知道麻煩告知一下,謝謝。
當然用Jackson解決就非常容易了,只需要在實體類上加上注解就可以。
@JsonIgnoreProperties(ignoreUnknown = true)
class ExtraBean {
private boolean is_museuser;
public boolean isIs_museuser() {
return is_museuser;
}
public void setIs_museuser(boolean is_museuser) {
this.is_museuser = is_museuser;
}
}
@JsonIgnore注解用來忽略某些字段,可以用在Field或者Getter方法上,用在Setter方法時,和Filed效果一樣。這個注解只能用在POJO存在的字段要忽略的情況,不能滿足現在需要的情況。
@JsonIgnoreProperties(ignoreUnknown = true),將這個注解寫在類上之后,就會忽略類中不存在的字段,可以滿足當前的需要。這個注解還可以指定要忽略的字段。使用方法如下:
@JsonIgnoreProperties({ "internalId", "secretKey" })
指定的字段不會被序列化和反序列化。
到此順利解決。(還有Gson有類似的實現請告知一下,本人只知道gson轉string忽略字段的方法,謝謝)
(原文地址:http://www.jianshu.com/p/f6884331d366)
同時參考了:
有時候,如果數據庫表中增加一個字段,但返回的JSON字符串中含有我們並不需要的字段,那么當對應的實體類中不含有該字段時,會拋出一個異常,告訴你有些字段沒有在實體類中找到。解決辦法很簡單,在聲明ObjectMapper之后,加上上述代碼:
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
(原文地址:http://www.cnblogs.com/davidwang456/p/5434071.html)