杰克逊反序列化成pojos
问题描述:
我想反序列化来自我无法控制的应用程序的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?
答
问题是在第一个JSON片段中,chromosomes
是一个字典(Map),其中一个条目(chromosome
)碰巧对应于您的Chromosome
对象。
更精确的直接映射到Java类将是
class Assembly{
...
private Map<String, Chromosome> chromosomes;
}
既然你提到你无法控制源JSON格式,你可能要考虑使用custom deserializers,或者使用streaming支持来自Jackson而不是ObjectMapper的直接映射,如果你不喜欢以这种方式改变你的POJO。
顺便说一句,最好是通过它们的接口类型(List
)而不是具体类型(ArrayList
)来引用集合。引用这个类的代码不太可能真正在意或需要知道它使用的是ArrayList
,而仅仅指List
接口,如果需要(作为一般原则),则更容易交换其他实现。
我确实看过反序列化器和流式支持,如果我别无选择,我会创建自己的解析。我想要的东西非常快,因为键(汇编,染色体)是类的名称。就像:你看到组件的话,所以使用Assembly构造函数。对于地图,它确实是一个染色体列表。 – oyo 2011-03-16 13:43:16