【问题标题】:How to deserialize polymorphic LinkedList with Jackson JSON and JAVA?如何使用 Jackson JSON 和 JAVA 反序列化多态 LinkedList?
【发布时间】:2012-02-28 18:17:10
【问题描述】:

我在尝试反序列化 Java 类时遇到了一些问题。 我的课程是:

Abstract Class A {
Long ID
String name 
...
}
Class B extends A{ 
String Type
String Value
}
Class C extends A{
List<A> typedList;
}

还有我的序列化/反序列化方法:

public String serialize(T object) {
        String returnValue = "";

        try {
            returnValue = mapper.writeValueAsString(object);

        } catch (JsonGenerationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(returnValue);
        return returnValue;
    }

public List<T> unserialize(String data, Class<?> clazz) {
        List<T> returnValue = new LinkedList<T>();
        //JavaType topMost = mapper.getTypeFactory().constructParametricType(MyWrapper.class, ActualClassRuntime.class); 
        try {

            returnValue = (List<T>) mapper.readValue(data,clazz);
        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return returnValue;
    }

C 类中的列表包含 B 和 C 元素。序列化完成没有问题,但是当我尝试反序列化 C 时,Jackson 无法正确重建我的 typedList。 它使用 LinkedHashMap 而不是 LinkedList 并且不使用正确的类型。 任何想法如何解决这个问题? 提前致谢!

【问题讨论】:

  • @alfasin 这与php无关

标签: java json polymorphism jackson deserialization


【解决方案1】:

如果你希望得到一个 List,你必须传递一个 List 类型:这里你给出的类型是 clazz,但期望类型是 List&lt;T&gt;。这不起作用,即使clazz 的类型是List。 所以你需要传递正确的类型。但是对于 List(和 Map)类型,您还需要指定内容 type: 并且类型变量不这样做。工作原理是这样的:

List<MyType> list = mapper.readValue(jsonSource, new TypeReference<List<MyType>>() { });

由于 Java 类型擦除,必须使用 TypeReference

如果组件作为参数传递,您还可以动态地从组件构造结构化类型:

Class<?> elem = ...;
List<?> list = mapper.readValue(jsonSource,
  mapper.getTypeFactory().constructCollectionType(ArrayList.class, elem);

你得到LinkedHashMap的原因仅仅是因为缺少类型信息:如果遇到JSON对象,并且请求的类型是java.lang.Object(如果你只是传递类型List.class来绑定就是这种情况),这是将使用的类型。

【讨论】:

  • 感谢您的帮助。像魅力一样工作 =)。
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2023-03-04
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
相关资源
最近更新 更多