当json包含type属性时,jackson能否确定要反序列化的根对象类型?

Naz*_* K. 9 java json jackson

假设序列化为json包含实际对象的类名,在Class上使用此批注:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@type")
class MyClass {
    String foo;
}
Run Code Online (Sandbox Code Playgroud)

所以json就是这样的:

{"@type": "com.example.MyClass", "foo": "bar"}
Run Code Online (Sandbox Code Playgroud)

可以在不指定类型的情况下反序列化吗?我的意思是甚至不是超级型.就像这样:

objectMapper.readValue(value, Object.class);
Run Code Online (Sandbox Code Playgroud)

它实际上没有用,它带回了一张地图.

was*_*ren 8

嗯,我当然可以做到这一点,尽管我个人从未使用过杰克逊.您可以将其反序列化为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());
Run Code Online (Sandbox Code Playgroud)

输出是:

我的课

  • 哦,是的,我想这很有效.我想知道是否有更内置的方式,但我想这没有任何意义,因为杰克逊不可能知道我如何配置JsonTypeInfo,而不知道类.非常感谢. (2认同)