2011-03-16 150 views
2

我想反序列化来自我无法控制的应用程序的JSON对象。在这里我的JSON:杰克逊反序列化成pojos

{"assembly": 
    {"name":"mm9", 
     "id":32, 
     "chromosomes":[ 
      {"chromosome": 
        {"name":"MT"} 
      }]}} 

我的POJO,是

class Assembly{ 
     private String name; 
     private int id; 
     private ArrayList<Chromosome> chromosomes; 
     // getters & setters 
} 
class Chromosome { 
    private String name; 
    //getter/setters 

} 

但它不是一个JSON的工作,因为额外的领域的 “集结号” & “染色体”,所以像:

{"name":"mm9", 
    "id":32, 
    "chromosomes":[  
      {"name":"MT"} 
       ] }} 

它只是工作。 有没有办法修改配置或其他东西来实现这一点,而不创建更复杂的POJOS?

回答

1

问题是在第一个JSON片段中,chromosomes是一个字典(Map),其中一个条目(chromosome)碰巧对应于您的Chromosome对象。

更精确的直接映射到Java类将是

class Assembly{ 
    ... 
    private Map<String, Chromosome> chromosomes; 
} 

既然你提到你无法控制源JSON格式,你可能要考虑使用custom deserializers,或者使用streaming支持来自Jackson而不是ObjectMapper的直接映射,如果你不喜欢以这种方式改变你的POJO。

顺便说一句,最好是通过它们的接口类型(List)而不是具体类型(ArrayList)来引用集合。引用这个类的代码不太可能真正在意或需要知道它使用的是ArrayList,而仅仅指List接口,如果需要(作为一般原则),则更容易交换其他实现。

+0

我确实看过反序列化器和流式支持,如果我别无选择,我会创建自己的解析。我想要的东西非常快,因为键(汇编,染色体)是类的名称。就像:你看到组件的话,所以使用Assembly构造函数。对于地图,它确实是一个染色体列表。 – oyo 2011-03-16 13:43:16