通用JSON对象转换

时间:2010-08-02 10:34:26

标签: java json jackson

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

5 个答案:

答案 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)