使用Jackson反序列化从JSON到POJO的消息

时间:2012-03-21 21:55:26

标签: java jackson pojo

如果您不知道在不检查消息的情况下确切使用哪种类型的POJO,您将如何使用Jackson将JSON文档反序列化为POJO。有没有办法向杰克逊注册一组POJO,以便根据消息选择一个?

我正在尝试解决的方案是通过网络接收JSON消息,并根据消息内容反序列化为多个POJO之一。

3 个答案:

答案 0 :(得分: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中的字段以解析类型。

答案 1 :(得分:0)

如果您的JSON库具有灵活性,请查看Jackson。它有BeanDeserializer可用于此目的。

答案 2 :(得分: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);