Sonntag, Juli 5, 2020

Jackson Deserialisieren hash map

Habe ich folgenden JSON:

"propertyName": "{"1":[{"1":"value1","2":"value2","3":false}]}"

die erste Eigenschaft, die die Anzahl der Elemente im array folgende, die eine Karte von Eigenschaften.

Was ist der beste Weg, um Deserialisieren diese mit Jackson
wenn ich will, zu füllen mit einem Klasse halten diese Werte:

class MyHolder
{
   name = "value1";
   age = "value2";
   female = false;
}

zum Beispiel.

InformationsquelleAutor Drejc | 2014-01-29

2 Kommentare

  1. 4

    Ihre JSON ist nicht gültig. Lassen Sie uns davon ausgehen, dass JSON sieht wie folgt aus:

    {
       "propertyName":{
          "1":[
             {
                "1":"value1",
                "2":"value2",
                "3":false
             }
          ]
       }
    }

    Die einfachste Möglichkeit ist das erstellen POJO-Klassen, die passt zu deinem JSON. Zum Beispiel:

    class Root {
    
        private Map<String, List<MyHolder>> propertyName;
    
        //getters,setters,toString
    }
    
    class MyHolder {
    
        @JsonProperty("1")
        private String name;
        @JsonProperty("2")
        private String age;
        @JsonProperty("3")
        private boolean female;
    
        //getters,setters,toString
    }

    Nun können wir leicht Deserialisieren es auf diese Weise:

    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.readValue("{.. json ...}", Root.class));

    Oben genannten Programm druckt:

    Root [propertyName={1=[MyHolder [name=value1, age=value2, female=false]]}]

    Wenn wir nicht wollen, um zu sehen Map in unserem POJO Klasse, die wir haben, schreiben Sie benutzerdefinierte Konverter:

    class MapMyHolderConverter implements Converter<Map<String, List<Map<String, Object>>>, List<MyHolder>> {
    
        @Override
        public JavaType getInputType(TypeFactory typeFactory) {
            return typeFactory.constructMapType(Map.class, String.class, List.class);
        }
    
        @Override
        public JavaType getOutputType(TypeFactory typeFactory) {
            return typeFactory.constructCollectionType(List.class, MyHolder.class);
        }
    
        @Override
        public List<MyHolder> convert(Map<String, List<Map<String, Object>>> map) {
            Collection<List<Map<String, Object>>> values = map.values();
            if (values.isEmpty()) {
                return Collections.emptyList();
            }
    
            List<MyHolder> result = new ArrayList<>();
            for (Map<String, Object> item : values.iterator().next()) {
                MyHolder holder = new MyHolder();
                holder.setName(item.get("1").toString());
                holder.setAge(item.get("2").toString());
                holder.setFemale((Boolean) item.get("3"));
                result.add(holder);
            }
    
            return result;
        }
    }

    Ihre POJO-Klassen könnte wie folgt Aussehen:

    class Root {
    
        @JsonDeserialize(converter = MapMyHolderConverter.class)
        private List<MyHolder> propertyName;
    
        //getters,setters,toString
    }
    
    class MyHolder {
    
        private String name;
        private String age;
        private boolean female;
    
        //getters,setters,toString
    }

    Wie Sie sehen können, im zweiten Beispiel benutzen wir @JsonDeserialize annotation und wir haben nicht zu verwenden @JsonProperty.

  2. 6

    Deserialisieren Liste/Sammlung von konkreten Werten (eher dann die LinkedHashMap erhalten Sie standardmäßig), müssen Sie die pass-geben Sie Informationen zu Jackson:

    mapper.readValue(jsonString, new TypeReference<List<MyHolder>>() { });

    Den anderen Weg, das gleiche zu tun ist:

    CollectionType javaType = mapper.getTypeFactory().constructCollectionType(List.class, MyHolder.class);
    List<MyDto> asList = mapper.readValue(jsonString, javaType);

    Hoffe, das hilft.

    • Dies funktioniert Super. Zum Beispiel deserialisiert werden, um ein Map<String, JsonBean>: Map<String, JsonBean> myMap = mapper.readValue(json, new TypeReference<Map<String, JsonBean>>(){})

Kostenlose Online-Tests