我在java中使用ObjectMapper类反序列化JSON对象。 我正在获取不同类型的对象(?extends Something)并想知道是否有任何方法以某种通用方式对它们进行反序列化。 readValue方法获取输出对象类型的一些Class类型对象,因此它以某种方式强类型化。
答案 0 :(得分:7)
Jackson不仅可以将类型擦除的类作为目标类型,还可以使用通常的“超类型令牌”模式的TypeReference。来自Jackson FAQ:
List<MyBean> result = mapper.readValue(src, new TypeReference<List<MyBean>>() { });
这适用于所有类型的泛型,而不仅仅是地图和集合。这是为了你想到泛型类型;所以你只有一个类但有多个参数变化。
但听起来好像你想要的实际上支持反序列化多态类型;这也是支持(截至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(){ }
}
并反序列化:
Message msg = objectMapper.readValue(json, Message.class);
获取Message的任何子类。并使用'objectMapper.writeValue();'
序列化答案 1 :(得分:0)
您是否尝试过JSON in Java?
答案 2 :(得分:0)
我一直在使用Json-lib库来实现这个目标,并对结果非常满意。 看一下图书馆的例子http://json-lib.sourceforge.net/ 您可以注册自定义变形器,将json的嵌套元素转换为适当的类。 我能够从json到java获得相当复杂的结构并访问所有嵌套字段。
希望有所帮助
答案 3 :(得分:0)
以下是我的回答:
首先,我已从ObjectMapper切换到Gson。 定义一个抽象类和一个类型枚举:
public abstract class Message {
private MessageType type;
protected Message(){
type = setType();
}
protected abstract MessageType setType();
public MessageType getType() {
return type;
}
public void setType(MessageType type) {
this.type = type;
}
}
public enum MessageType {
PRESENCE(PresenceMessage.class),
TEXT(TextMessage.class);
private Class<? extends Message> clazz;
private MessageType(Class<? extends Message> clazz){
this.clazz = clazz;
}
public Class<? extends Message> getClazz() {
return clazz;
}
}
扩展Message的每个类都是我们通过Json发送的实际类。它必须实现getType()方法。
所以当desirializing只使用该代码时:
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(get.getResponseBodyAsStream(),"UTF-8"));
while ((line = reader.readLine()) != null){
builder.append(line);
}
if (clazz == Message.class){
String string = builder.toString();
Message message = gson.fromJson(string,Message.class);
if (message.getType() == null)
throw new IllegalStateException("Could not de-serialize message " + builder.toString() );
return (T)gson.fromJson(string,message.getType().getClazz());
}
我希望你能自己填补缺失的部分。
答案 4 :(得分:-2)