Perché non riesco a scartare e serializzare una mappa Java utilizzando la libreria Java di Jackson?

Il mio fagiolo ha questo aspetto:

class MyBean { private @JsonUnwrapped HashMap map = new HashMap(); private String name; public HashMap getMap() { return map; } public void setMap(HashMap map) { this.map = map; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

Mentre sto serializzando il bean usando il seguente codice:

 MyBean bean = new MyBean(); HashMap map = new HashMap();; 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)); 

Sto ottenendo risultati come questo:

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

ma

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

è previsto per la documentazione di JacksonFeatureUnwrapping . Perché non ottengo il risultato da scartare?

@JsonUnwrapped non funziona per le mappe, solo per POJO corretti con getter e setter. Per le mappe, dovresti usare @JsonAnyGetter e @JsonAnySetter (disponibile in versione jackson> = 1.6).

Nel tuo caso, prova questo:

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

In questo modo, puoi anche aggiungere direttamente proprietà alla mappa, come add('abc','xyz') aggiungerà una nuova chiave abc alla mappa con valore xyz .

C’è attualmente un problema aperto al progetto Jackson per consentire il supporto per @JsonUnwrapped su Maps. È elencato come un cambiamento che potrebbe essere posticipato dalla prossima versione 2.9, quindi sembra probabile che questo non sarà incluso fino alla versione 2.10.

Fino ad allora, la soluzione per l’utilizzo di @ JsonAnySetter / @ JsonAnyGetter proposto in un’altra risposta sembra essere la strada da percorrere.