2012-03-21 65 views
3

你会如何反序列化JSON文档使用杰克逊POJO,如果你不知道没有检查消息使用什么类型的POJO。有没有办法向杰克逊注册一组POJO,以便根据消息选择一个POJO?消息POJO使用杰克逊

我试图解决的方案是通过线路接收JSON消息和反序列化到基于消息的内容POJO的几个之一。

回答

2

我不知道,你所描述的机制。 我认为你将不得不自行检查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领域,以解决该类型。

+0

这看起来很不错的内容,具体的POJO。我很欣赏这种回应。 – Josh 2012-03-22 15:45:55

+1

一个额外的建议:也可以直接从树('JsonNode')转换成由POJO:“对象myObject的= mapper.treeAsValue(节点,类型);”。 这不仅更高效,而且还允许您修改树(如果需要)(添加或删除节点,更改值)。 – StaxMan 2012-03-22 17:18:22

0

如果你在你的JSON库的灵活性,看看Jackson。它有一个BeanDeserializer可以用于这个目的。

+0

这不是真的清楚如何使用类反序列化给出的消息.. – Josh 2012-03-21 23:36:28

0

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);