2013-08-04 5 views
25

Meine Bohne sieht wie folgt aus:Warum kann ich eine Java-Map mit der Jackson Java-Bibliothek nicht auspacken und serialisieren?

class MyBean { 

    private @JsonUnwrapped HashMap<String, String> map = new HashMap<String, String>(); 

    private String name; 

    public HashMap<String, String> getMap() { 
     return map; 
    } 

    public void setMap(HashMap<String, String> map) { 
     this.map = map; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

Während ich die Bohne mit dem folgenden Code Serialisierung:

MyBean bean = new MyBean(); 
HashMap<String, String> map = new HashMap<String, String>();; 
map.put("key1", "value1"); 
map.put("key2", "value2"); 
bean.setMap(map); 
bean.setName("suren"); 
ObjectMapper mapper = new ObjectMapper(); 
System.out.println("\n"+mapper.writeValueAsString(bean)); 

Ich bin Ergebnis wie folgt bekommen:

{"map":{"key2":"value2","key1":"value1"},"name":"suren"} 

aber

{"key2":"value2","key1":"value1","name":"suren"} 

wird per JacksonFeatureUnwrapping documentation erwartet. Warum bekomme ich das unverpackte Ergebnis nicht?

Antwort

55

@JsonUnwrapped funktioniert nicht für Karten, nur für ordnungsgemäße POJOs mit Getter und Setter. Für Karten sollten Sie @JsonAnyGetter und @JsonAnySetter verwenden (verfügbar in Jackson Version> = 1.6).

In Ihrem Fall versuchen Sie dies:

@JsonAnySetter 
    public void add(String key, String value) { 
     map.put(key, value); 
    } 

    @JsonAnyGetter 
    public Map<String,String> getMap() { 
     return map; 
    } 

Auf diese Weise können Sie auch direkt Eigenschaften hinzufügen zu der Karte, wie add('abc','xyz')xyz einen neuen Schlüssel abc auf der Karte mit Wert hinzufügen.

2

Es gibt derzeit eine an open issue im Jackson-Projekt, um Unterstützung für @JsonUnwrapped auf Maps zu ermöglichen. Es wird als change likely to be postponed von der kommenden 2.9-Version aufgeführt, so dass es wahrscheinlich ist, dass dies nicht vor Version 2.10 enthalten sein wird.

Bis dahin scheint die in einer anderen Antwort vorgeschlagene Umgehung der Verwendung von @ JsonAnySetter/@ JsonAnyGetter der richtige Weg zu sein.

Verwandte Themen