使用Jackson将消息从JSON反序列化为POJO

3

如果您不知道要使用哪种POJO来反序列化JSON文档,而没有检查消息的方式,您将如何使用Jackson将JSON文档反序列化为POJO?是否有一种方法可以向Jackson注册一组POJO,以便它可以基于消息选择其中一个?

我想解决的场景是通过线路接收JSON消息并根据消息内容反序列化为多个POJO之一。

3个回答

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
一个额外的建议:您还可以直接将树(JsonNode)转换为POJO: "Object myObject = mapper.treeAsValue(node, type);"。这不仅更有效率,而且还允许您修改树(添加或删除节点,更改值)。 - StaxMan

0
如果您的JSON库具有灵活性,请看一下Jackson。它有一个BeanDeserializer,可以用于这个目的。

并不是很清楚如何使用该类来将消息内容反序列化为特定的POJO。 - Josh

0

BeanDeserializer在Jackson中已被弃用。 然而,我遇到了同样的问题,并使用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 是 {"value1":1,"value2":"abc"}
    
请注意,您无法序列化具有循环引用的对象,因为这将导致无限递归。
  • 反序列化

    BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接