反序列化为未定义泛型类型列表

问题描述 投票:0回答:1

我定义了一个类Person:

public static class Person{
    private String name;
    private String surname;
    // Getters, setters, contructor...
}

我运行以下代码:

@Test
public void minimalGenericJackson() throws JsonProcessingException {
    List list = new ArrayList();
    list.add(23);
    list.add(new Person("John", "Doe"));

    ObjectMapper objectMapper = new ObjectMapper();

    final String json = objectMapper.writeValueAsString(list);


    final List outList = objectMapper.readValue(json, List.class);
    final Person person = (Person) outList.get(1);
}

Json 字符串必须被序列化,然后反序列化为 java 对象。在反序列化过程结束时,我需要将 Person 项反序列化为 Person 类型的对象,但在我的情况下不是这样,它被反序列化为 LinkedHashMap。如果可能的话,我需要一个不改变测试代码,只改变Person.java代码的方案。

我运行的代码产生以下异常:

java.lang.ClassCastException:类 java.util.LinkedHashMap 不能 投射到班级 de.mpg.ipp.codac.archivedb.restapi.JsonTestsPlayground$Person (java.util.LinkedHashMap位于加载程序'bootstrap'的java.base模块中; de.mpg.ipp.codac.archivedb.restapi.JsonTestsPlayground$人员位于 加载器“app”的未命名模块)

是否只需要在Person类中添加Jackson注解就可以解决这个问题呢?也许通过定义 Person 类来获取附加类型属性。就像使用

@JsonTypeInfo
@JsonSubTypes
完成的一样,但在我的例子中我没有设法使用这些,因为 person 不是我的另一个类的子类型。另外我想避免启用默认输入。

List 应该具有未定义的泛型类型,因为它可能包含任何原始值和/或 Person 对象。我的问题的目标是成功反序列化包含 Person 对象和其他原始值的 List。

在这种情况下不能使用

TypeReference
JavaType
,因为 List 包含变量基元类型和 Person 对象的值。

java json jackson
1个回答
0
投票

您收到此错误是因为您无法将 HashMap 转换为自定义对象,因此如果您想要一个通用列表,则必须每次将 HashMap 转换为您的自定义对象。

ES。

public static class Person {
    private String name;
    private String surname;
    // Getters, setters, constructor...
}

您可以运行以下代码,它将起作用:

@Test
public void minimalGenericJackson() throws JsonProcessingException {
        List<Object> list = new ArrayList<>();
        list.add(23);
        list.add(new Person("John", "Doe"));

        ObjectMapper objectMapper = new ObjectMapper();

        final List<Object> outList = objectMapper.convertValue(list, new TypeReference<>() {
        });
        System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(outList));

        final Person person = objectMapper.convertValue(outList.get(1), Person.class);
        System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(person));
}
© www.soinside.com 2019 - 2024. All rights reserved.