2016-01-13 49 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