2015-07-16 4 views
1

Я хочу десериализовать этот JSON «{\" m \ ": {\" Test \ ": {\" nombre \ ": \" jose \ ", \" apellidos \ ": \" jose \ ", \ edad \": 30}}} "в PersonaContainer.JSON HashMap deserialization

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 объекта, но когда я пытаюсь получить «Test» от HashMap «м» и бросайте его Person объекта я получаю эту ошибку:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to persona 
    at MyJSONTest.main(MyJSONTest.java:52) 

какие-либо советы, пожалуйста?

+2

Не используйте необработанные типы. –

+1

В 'PersonaContainer' атрибут' m', его получатель и его сеттер все должны использовать 'Map '. –

+0

Хорошо, я понимаю, он отлично работает, но если я продюсирую персону из humano @FedericoPeraltaSchaffner – Jose

ответ

2

Учитывая только

private Map m = ...; 

Джексон понятия не имеет, какие типы вы ожидаете для ключей и ценностей Map «s. Поэтому он использует свои значения по умолчанию. Для обычных объектов используется LinkedHashMap. Другими словами, это будет десериализации

{"nombre":"jose","apellidos":"jose","edad":30} 

в LinkedHashMap инстанции. Когда вы пытаетесь использовать его как Persona, он не работает с ClassCastException.

Вместо этого не используйте необработанные типы. Объявите Map с соответствующими аргументами общего характера.

private Map<String, Persona> m = ...; 

Обратите внимание, что весна будет десериализации соответствующий JSON (m) в LinkedHashMap, а не HashMap. Если вы хотите HashMap, объявите поле с типом HashMap.