你会如何反序列化JSON文档使用杰克逊POJO,如果你不知道没有检查消息使用什么类型的POJO。有没有办法向杰克逊注册一组POJO,以便根据消息选择一个POJO?消息POJO使用杰克逊
我试图解决的方案是通过线路接收JSON消息和反序列化到基于消息的内容POJO的几个之一。
你会如何反序列化JSON文档使用杰克逊POJO,如果你不知道没有检查消息使用什么类型的POJO。有没有办法向杰克逊注册一组POJO,以便根据消息选择一个POJO?消息POJO使用杰克逊
我试图解决的方案是通过线路接收JSON消息和反序列化到基于消息的内容POJO的几个之一。
我不知道,你所描述的机制。 我认为你将不得不自行检查JSON:
Map<String, Class<?>> myTypes = ...
String json = ...
JsonNode node = mapper.readTree(json);
String type = node.get("type").getTextValue();
Object myobject = mapper.readValue(json, myTypes.get(type));
如果你没有一个类型字段,你将不得不检查在JsonNode领域,以解决该类型。
如果你在你的JSON库的灵活性,看看Jackson。它有一个BeanDeserializer可以用于这个目的。
这不是真的清楚如何使用类反序列化给出的消息.. – Josh 2012-03-21 23:36:28
BeanDeserializer,杰克逊已经过时了。 但是,我遇到了同样的问题,我使用Google的GSon解决了这个问题。看看这个例子。
鉴于你的POJO数据类型:
class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;
BagOfPrimitives() {
// no-args constructor
}
}
系列化
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj); // ==> json is {"value1":1,"value2":"abc"}
请注意,您不能序列循环引用的对象,因为这将导致无穷递归。
反序列化
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
这看起来很不错的内容,具体的POJO。我很欣赏这种回应。 – Josh 2012-03-22 15:45:55
一个额外的建议:也可以直接从树('JsonNode')转换成由POJO:“对象myObject的= mapper.treeAsValue(节点,类型);”。 这不仅更高效,而且还允许您修改树(如果需要)(添加或删除节点,更改值)。 – StaxMan 2012-03-22 17:18:22