如果您不知道在不检查消息的情况下确切使用哪种类型的POJO,您将如何使用Jackson将JSON文档反序列化为POJO。有没有办法向杰克逊注册一组POJO,以便根据消息选择一个?
我正在尝试解决的方案是通过网络接收JSON消息,并根据消息内容反序列化为多个POJO之一。
答案 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)
鉴于您的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);