当前位置: 代码迷 >> java >> JSON HashMap反序列化
  详细解决方案

JSON HashMap反序列化

热度:41   发布时间:2023-07-27 09:28:17.0

我想反序列化此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)

有什么建议吗?

只给

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

  相关解决方案