我定义了一个类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 对象的值。
您收到此错误是因为您无法将 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));
}