2013-08-04 14 views
25

Moja fasola wygląda następująco:Dlaczego nie mogę odinstaluj i serializować mapy Java przy użyciu biblioteki Java Java?

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; 
    } 
} 

Chociaż ja szeregowania fasoli stosując następujący kod:

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)); 

Dostaję wynik tak:

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

ale

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

jest oczekiwany za JacksonFeatureUnwrapping documentation. Dlaczego nie otrzymuję nieopakowanego wyniku?

Odpowiedz

55

@JsonUnwrapped nie działa dla map, tylko dla właściwych POJO z modułami pobierającymi i ustawiającymi. W przypadku map, należy użyć @JsonAnyGetter i @JsonAnySetter (dostępnego w wersji jackson> = 1.6).

W twoim przypadku, spróbuj tego:

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

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

W ten sposób można również bezpośrednio dodać właściwości do mapy, jak add('abc','xyz') doda nowy klucz abc na mapie o wartości xyz.

2

W projekcie Jackson jest obecnie an open issue, aby umożliwić obsługę @JsonUnwrapped na mapach. Został wymieniony jako change likely to be postponed z nadchodzącego wydania 2.9, więc wydaje się prawdopodobne, że nie zostanie on włączony do wersji 2.10.

Do tego czasu sposób obejścia problemu przy użyciu @ JsonAnySetter/@ JsonAnyGetter zaproponowany w innej odpowiedzi wydaje się być właściwą drogą.