2013-08-01 6 views
37

ich die folgende Klasse haben:in eine HashMap von benutzerdefinierten Objekte mit jackson Deserialisieren

import org.codehaus.jackson.annotate.JsonIgnoreProperties; 
import org.codehaus.jackson.annotate.JsonProperty; 

import java.io.Serializable; 
import java.util.HashMap; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Theme implements Serializable { 

    @JsonProperty 
    private String themeName; 

    @JsonProperty 
    private boolean customized; 

    @JsonProperty 
    private HashMap<String, String> descriptor; 

    //...getters and setters for the above properties 
} 

Wenn ich führen Sie den folgenden Code ein:

HashMap<String, Theme> test = new HashMap<String, Theme>(); 
    Theme t1 = new Theme(); 
    t1.setCustomized(false); 
    t1.setThemeName("theme1"); 
    test.put("theme1", t1); 

    Theme t2 = new Theme(); 
    t2.setCustomized(true); 
    t2.setThemeName("theme2"); 
    t2.setDescriptor(new HashMap<String, String>()); 
    t2.getDescriptor().put("foo", "one"); 
    t2.getDescriptor().put("bar", "two"); 
    test.put("theme2", t2); 
    String json = ""; 
    ObjectMapper mapper = objectMapperFactory.createObjectMapper(); 
    try { 
     json = mapper.writeValueAsString(test); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Die json Zeichenfolge wie folgt hergestellt Aussehen:

{ 
    "theme2": { 
    "themeName": "theme2", 
    "customized": true, 
    "descriptor": { 
     "foo": "one", 
     "bar": "two" 
    } 
    }, 
    "theme1": { 
    "themeName": "theme1", 
    "customized": false, 
    "descriptor": null 
    } 
} 

Mein Problem ist, dass die obige JSON-Zeichenfolge wieder in eine

de-serizlize
HashMap<String, Theme> 

Objekt.

Mein Deserialisierung Code sieht wie folgt aus:

HashMap<String, Themes> themes = 
     objectMapperFactory.createObjectMapper().readValue(json, HashMap.class); 

Welche de-serialisiert in eine HashMap mit den richtigen Tasten, sondern Themenobjekte für die Werte nicht erstellen. Ich weiß nicht, was ich anstelle von "HashMap.class" in der readValue() -Methode angeben soll.

Jede Hilfe wäre willkommen.

Antwort

66

sollten Sie bestimmten Kartentyp erstellen und in Deserialisierung bieten:

TypeFactory typeFactory = mapper.getTypeFactory(); 
MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, Theme.class); 
HashMap<String, Theme> map = mapper.readValue(json, mapType); 
+0

Ok, wir sind auf jeden Fall in der richtigen Richtung, wie es De-Serialisierung wird den Code oben. Die Hashmap kommt jedoch nur mit einem einzelnen Schlüssel/Wert (theme2). Es hat das richtige Thema mit dem Schlüssel verbunden, aber theme1 ist nicht in der hashmap? – wbj

+0

Warum nicht. Für mich, App druckt dies, wenn ich dein JSON deserialize: '{theme1 = Thema [themeName = theme1, benutzerdefiniert = falsch, descriptor = null], theme2 = Thema [themeName = theme2, angepasst = wahr, descriptor = {foo = one, Balken = zwei}]} '. –

+0

Das Problem gefunden - schlecht geformte JSON-Zeichenfolge in meinen Testdaten. So funktioniert deine Lösung wie beworben;) – wbj

12

Sie TypeReference Klasse verwenden kann, die die Art Casting für Karte funktioniert mit Typ Benutzer definiert. Weitere Dokumentation zu http://wiki.fasterxml.com/JacksonInFiveMinutes

ObjectMapper mapper = new ObjectMapper(); 
Map<String,Theme> result = 
    mapper.readValue(src, new TypeReference<Map<String,Theme>>() {}); 
Verwandte Themen