2016-01-13 51 views
1

JSON對象的特定屬性:寫傑克遜自定義解串器在一個層次JSON地圖

["emp" : { 
     "departments": [ 
      "modules": [ 
       { 
        "tasks": [ 
         { 
          "resources": 100, 
          "notes": "" 
         } 
        ] 
       } 
      ] 
     ] 
    }] 

我希望上述JSON映射到List<Emp>對象。我的對象映射器將如下所示:
List<Emp> emps = Arrays.asList(mapper.readValue(jsonString, Emp[].class));

這種簡單的對象映射效果很好。
我的問題是我必須以不同的方式反序列化從JSON到Task對象的tasks對象。

我知道我們可以使用jackson編寫一個自定義的反序列化器,但這並不能解決我的問題。 我已經爲Task對象編寫了一個CustomeDeserializer,但如下所示將其註冊到Object Mapper將嘗試將整個JSON(List<Emp>)作爲任務對象進行序列化。

SimpleModule mod = new SimpleModule("MyModule"); 
     ObjectMapper mapper = new ObjectMapper(); 

     mod.addDeserializer(Task.class, 
      new CustomDeserializer(Task.class)); 
     mapper.registerModule(mod); 


有沒有辦法在分析過程中只爲特定屬性指定CustomDeserializer? 或者是否有替代方案?

注意:我無法更改我的DTO來解決此問題。

回答

0

與傑克遜解析JSON有幾種選擇。您可以使用Jacksons Tree model解析或streaming API。兩者都需要比mapper.readValue(jsonString, Emp[].class)更多的代碼,但比實現自己的JSON解析要好得多。您可以在Jackson文檔中閱讀關於它們的信息here