2013-06-21 34 views
4

說我有一個JSON文件看起來像這樣:傑克遜 - 處理JSON與多種類型

{ 
"response" : [ 
    { 
     "id" : "10", 
     "period" : "month", 
     "values" : [ 
      { 
       "value" : 100, 
       "date" : "2013-05-10" 
      } 
     ], 
     "parent" : "1" 
    }, 
    { 
     "id" : "10", 
     "period" : "day", 
     "values" : [ 
      { 
       "value" : { 
         "foo" : 10, 
         "bar" : 11, 
         "etc" : 4 
       }, 
       "date" : "2013-05-10" 
      } 
     ], 
     "parent" : "1" 
    },{ 
     "id" : "13", 
     "period" : "year", 
     "values" : [ 
      { 
       "value" : { 
         "info" : 1, 
         "pages" : 10, 
         "etc" : 4 
       }, 
       "date" : "2013-05-10" 
      } 
     ], 
     "parent" : "1" 
    } 
] 
} 

通知的「價值」的部分既可以是單一的值,或一個對象(其是唯一的)。

我想使用Jackson ObjectMapper輕鬆將其映射到POJO。

我有什麼至今:

public class Response 
{ 
    List<ResponseEntry> response; 
    /*getters + setters */ 

    public static class ResponseEntry 
    { 
     private String id; 
     private String period; 
     private String parent; 
     private List<Value> values; 
     /*setters + getters*/ 

     public static class Value 
     { 
      private Object value; 
      private String date; 
      /*setters+getters*/ 
     } 
    } 
} 

要映射的迴應,我只是說明我想要的文件,並告訴ObjectMapper映射到「響應」類

ObjectMapper mapper = new ObjectMapper(); 
Response r = mapper.readValues(json, Response.class); 

這工作,但是有沒有比用'對象'來保存'值'更好的方法?由於'價值'可以是單一的價值或對象,我有點困難搞清楚它應該是什麼。我確定有一種多態的方式來處理這個問題,但是我看了也找不到任何有用的東西。我很堅持,我會很感激任何幫助。

+0

其實你可以使用'JsonDeserializer'。看看這裏如何實現:http://stackoverflow.com/questions/13891415/deserializing-json-with-multiple-types-in-one-field – Andremoniy

回答

3

不幸的是,對於您正在處理的JSON的結構,反序列化它的唯一方法是使value屬性的類型爲Object。但是,一旦JSON被反序列化,您可以很容易地確定value是一個對象還是單個值。

請注意,JSON只支持五種數據類型:對象(Map in java),數組,字符串,數字和布爾值。它看起來像你的情況,value很可能是一個數字或一個數字地圖;那麼你有兩種可能性來檢查。使用快速的比較,您應該能夠找出它是什麼類型的值。

ObjectMapper mapper = new ObjectMapper(); 
Response r = mapper.readValues(json, Response.class); 
Value val = r.response.get(0).values.get(0); 
if (val.value instanceof Map) 
    ; // multiple 
else 
    ; // single