通用JSON对象转换

Rom*_*man 2 java json jackson

我正在使用java中的ObjectMapper类对JSON对象进行反序列化.我正在获取不同类型的对象(?extends Something)并想知道是否有任何方法以某种通用方式对它们进行反序列化.该readValue方法获取输出对象的类型的一些类型对象,以便它是某种强类型.

Sta*_*Man 7

杰克逊不仅可以将类型擦除的类作为目标类型,还可以使用通常的"超类型令牌"模式的TypeReference.来自Jackson FAQ:

List<MyBean> result = mapper.readValue(src, new TypeReference<List<MyBean>>() { });
Run Code Online (Sandbox Code Playgroud)

这适用于各种通用类型,而不仅仅是地图和集合.这是为了你想到泛型类型; 所以你只有一个类但有多个参数变化.

但听起来好像你想要的实际上是支持反序列化多态类型; 这也是支持(截至Jackson 1.5,请参阅http://wiki.fasterxml.com/JacksonPolymorphicDeserialization).

编辑:在另一个答案给出样本类,杰克逊的方式是:

import org.codehaus.jackson.annotate.JsonTypeInfo;

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS)
public abstract class Message
{
    protected Message(){ }
}
Run Code Online (Sandbox Code Playgroud)

并通过以下方式反序列化:

Message msg = objectMapper.readValue(json, Message.class);
Run Code Online (Sandbox Code Playgroud)

获取Message的任何子类.并使用'objectMapper.writeValue();'序列化