问题描述
我想反序列化此JSON“ {\\” m \\“:{\\” Test \\“:{\\” nombre \\“:\\” jose \\“,\\” apellidos \\“:\\” jose \\“,\\” edad \\ “:30}}}”连接到PersonaContainer。
public class Persona {
private String nombre;
private String apellidos;
private int edad;
... getters and setters;
}
public class PersonaContainer {
private Map m = new HashMap<String,Persona>();
public Map getM() {
return m;
}
public void setM(Map m) {
this.m = m;
}
}
然后,我创建一个角色角色的对象,并将其与下一个代码一起放入角色角色容器中
public class MyJSONTest {
public static void main(String args[]) {
ObjectMapper mapper = new ObjectMapper();
Map m = new HashMap<String,persona>();
Persona p = new Persona();
p.setNombre("jose");
p.setApellidos("jose");
p.setEdad(30);
m.put("Test", p);
PersonaContainer per = new PersonaContainer();
per.setM(m);
//convert Map to json string
try {
System.out.println(mapper.writeValueAsString(per));
} catch (IOException e) {
e.printStackTrace();
}
// convert json to Map
String json = "{\"m\":{\"Test\":{\"nombre\":\"jose\",\"apellidos\":\"jose\",\"edad\":30}}}";
try {
PersonaContainer pers = mapper.readValue(json, PersonaContainer.class);
Persona per1 = (Persona) pers.getM().get("Test");
System.out.println(per1.getNombre());
} catch (Exception e) {
e.printStackTrace();
}
}
}
序列化后,我使用ObjectMapper将JSON反序列化到PersonaContainer对象中,但是当我尝试从HashMap“ m”获取“ Test”并将其转换为Person Object时,出现此错误:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to persona
at MyJSONTest.main(MyJSONTest.java:52)
有什么建议吗?
1楼
只给
private Map m = ...;
杰克逊不知道您期望Map
的键和值是什么类型。
因此,它使用其默认值。
对于常规对象,它使用LinkedHashMap
。
换句话说,它将反序列化
{"nombre":"jose","apellidos":"jose","edad":30}
进入LinkedHashMap
实例。
当您尝试将其用作Persona
,它将失败并显示ClassCastException
。
相反,不要使用原始类型。
使用适当的通用参数声明Map
。
private Map<String, Persona> m = ...;
请注意,Spring将反序列化相应的JSON( m
)到LinkedHashMap
,而不是HashMap
。
如果你想有一个HashMap
,声明场类型HashMap
。