当json包含type属性时,杰克逊能否确定要反序列化的根对象类型?
假设序列化为json包含实际对象的类名,并在Class上使用此注释:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@type")class MyClass {
String foo;
}
以json为例:
{"@type": "com.example.MyClass", "foo": "bar"}
可以在不指定类型的情况下反序列化吗?我的意思是甚至没有超级类型。就像这样:
objectMapper.readValue(value, Object.class);
实际上不起作用,它会带回地图。
回答:
好吧,尽管我个人从来没有那样使用过杰克逊,但确实可以这样做。您可以将其反序列化为JsonNode
对象,然后将其转换为正确的类型。
final ObjectMapper objectMapper = new ObjectMapper();final MyClass myClass = new MyClass();
myClass.foo = "bar";
// Serialize
final String json = objectMapper.writeValueAsString(myClass);
// Deserialize
final JsonNode jsonNode = objectMapper.readTree(json);
// Get the @type
final String type = jsonNode.get("@type").asText();
// Create a Class-object
final Class<?> cls = Class.forName(type);
// And convert it
final Object o = objectMapper.convertValue(jsonNode, cls);
System.out.println(o.getClass());
输出为:
我的课
以上是 当json包含type属性时,杰克逊能否确定要反序列化的根对象类型? 的全部内容, 来源链接: utcz.com/qa/425478.html