json解析之jackson ObjectMapper


 

Json解析常用的有fastjson和jackson,性能上網上有不少的對比,說是fastjson比較好,今天先整理一下jackson的東西,后面再發一個fastjson的。

jackson是spring mvc內置的json轉換工具,fastjson則是阿里做的開源工具包。

jackson序列化如下:

 1 /**
 2  * json serialize
 3  * @param obj
 4  * @return
 5 */
 6 public static String jsonSerialize(final Object obj) {
 7     ObjectMapper om = new ObjectMapper();
 8     try {
 9         return om.writeValueAsString(obj);
10     } catch (Exception ex) {
11         return null;
12     }
13 }

jackson反序列化如下:

 1 /**
 2  * json deserialize
 3  * @param json
 4  * @param mapClazz
 5  * @return
 6 */
 7 public static Object jsonDeserialize(final String json, final Class<?> mapClazz) {
 8     ObjectMapper om = new ObjectMapper();
 9     try {
10         return om.readValue(json, mapClazz);
11     } catch (Exception ex) {
12         return null;
13     }
14 }

在使用的過程中,很有可能會遇到json反序列化的問題。當你對象中有get***()的地方,它就當做它是一個屬性,所以當你序列化json之后,在反序列化的時候,很有可能會出現異常的情況,因為在你的model中沒有這個***的定義。

那該如何處理和解決呢?

jackson給出了它自己的解決方案(JacksonHowToIgnoreUnknow):

1. 在class上添加忽略未知屬性的聲明:@JsonIgnoreProperties(ignoreUnknown=true)

2. 在反序列化中添加忽略未知屬性解析,如下:

 1 /**
 2  * json deserialize
 3  * @param json
 4  * @param mapClazz
 5  * @return
 6 */
 7 public static Object jsonDeserialize(final String json, final Class<?> mapClazz) {
 8     ObjectMapper om = new ObjectMapper();
 9     try {
10         // 忽略未知屬性
11         om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
12         return om.readValue(json, mapClazz);
13     } catch (Exception ex) {
14         return null;
15     }
16 }

3. 添加"Any setter"來處理未知屬性

1 // note: name does not matter; never auto-detected, need to annotate
2 // (also note that formal argument type #1 must be "String"; second one is usually
3 // "Object", but can be something else -- as long as JSON can be bound to that type)
4 @JsonAnySetter
5 public void handleUnknown(String key, Object value) {
6     // do something: put to a Map; log a warning, whatever
7 }

4. 注冊問題處理句柄

注冊一個DeserializationProblemHandler句柄,來調用ObjectMapper.addHandler()。當添加的時候,句柄的handleUnknownProperty方法可以在每一個未知屬性上調用一次。

這個方法在你想要添加一個未知屬性處理日志的時候非常有用:當屬性不確定的時候,不會引起一個綁定屬性的錯誤。

 


免責聲明!

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



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