Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通用JSON对象转换_Java_Json_Jackson - Fatal编程技术网

Java 通用JSON对象转换

Java 通用JSON对象转换,java,json,jackson,Java,Json,Jackson,我正在用java中的类反序列化JSON对象。 我得到了不同类型的对象(?扩展了一些东西),我想知道是否有办法以某种通用的方式对它们进行反序列化。 该方法获得了输出对象类型的某些类类型对象,因此它是强类型的。您尝试过吗?我一直在使用Json lib库来实现这一目标,并对结果感到非常满意。 看看图书馆的例子 您可以注册自定义变形器,将json的嵌套元素转换为适当的类。 我能够获得从json到java的相当复杂的结构,并访问所有嵌套字段 希望它能帮助Jackson不仅可以将类型擦除类作为目标类型,还可

我正在用java中的类反序列化JSON对象。 我得到了不同类型的对象(?扩展了一些东西),我想知道是否有办法以某种通用的方式对它们进行反序列化。
该方法获得了输出对象类型的某些类类型对象,因此它是强类型的。

您尝试过吗?

我一直在使用Json lib库来实现这一目标,并对结果感到非常满意。 看看图书馆的例子 您可以注册自定义变形器,将json的嵌套元素转换为适当的类。 我能够获得从json到java的相当复杂的结构,并访问所有嵌套字段


希望它能帮助

Jackson不仅可以将类型擦除类作为目标类型,还可以使用通常的“超级类型令牌”模式的类型引用。来自Jackson常见问题解答:

List<MyBean> result = mapper.readValue(src, new TypeReference<List<MyBean>>() { });
并通过以下方式反序列化:

Message msg = objectMapper.readValue(json, Message.class);

获取消息的任何子类。并使用“objectMapper.writeValue();”进行序列化

以下是我的答案:

首先,我已从转换为。 定义抽象类和类型枚举:

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;
   }
}
我希望你能自己补上缺的部分。

GSON杜德。

它不支持绑定,就像DOM一样的树。这是一个很好的解决方案,我可以考虑在未来的很多工作中使用它,杰克逊只能用一个JasyType信息注释在基类上自动完成。但无论如何,祝你好运!
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;
   }
}
    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());
    }