【发布时间】:2012-03-21 21:55:26
【问题描述】:
如果您在不检查消息的情况下不确切知道要使用哪种类型的 POJO,您将如何使用 Jackson 将 JSON 文档反序列化为 POJO。有没有办法向 Jackson 注册一组 POJO,以便它可以根据消息选择一个?
我试图解决的场景是通过网络接收 JSON 消息,并根据消息的内容反序列化为多个 POJO 之一。
【问题讨论】:
如果您在不检查消息的情况下不确切知道要使用哪种类型的 POJO,您将如何使用 Jackson 将 JSON 文档反序列化为 POJO。有没有办法向 Jackson 注册一组 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 中的字段才能解析类型。
【讨论】:
JsonNode) 转换为 POJO。这不仅效率更高,而且还允许您根据需要修改树(添加或删除节点、更改值)。
如果您的 JSON 库具有灵活性,请查看 Jackson。它有一个BeanDeserializer 可用于此目的。
【讨论】:
杰克逊的 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);
【讨论】: