web-dev-qa-db-fra.com

Pourquoi je ne suis pas en mesure de déballer et de sérialiser une carte Java à l'aide de la bibliothèque Jackson Java?

Mon haricot ressemble à ceci:

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

Pendant que je sérialise le bean en utilisant le code suivant:

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

J'obtiens un résultat comme celui-ci:

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

mais

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

est attendu par le JacksonFeatureUnwrapping documentation . Pourquoi ne reçois-je pas le résultat déballé?

43
Suren Raju

@JsonUnwrapped Ne fonctionne pas pour les cartes, uniquement pour les POJO appropriés avec des getters et des setters. Pour les cartes, vous devez utiliser @JsonAnyGetter et @JsonAnySetter (disponible en version jackson> = 1.6).

Dans votre cas, essayez ceci:

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

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

De cette façon, vous pouvez également ajouter directement des propriétés à la carte, comme add('abc','xyz') ajoutera une nouvelle clé abc à la carte avec la valeur xyz.

90
Hari Menon

Il y a actuellement un n problème ouvert au projet Jackson pour permettre le support de @JsonUnwrapped sur Maps. Il n'est pas marqué comme étant dans les prochaines versions 2.10 ou 3.x de Jackson, il ne semble donc pas qu'il se trouve sur la feuille de route des fonctionnalités à court terme.

Tant que cette fonctionnalité n'est pas prise en charge, la solution de contournement concernant l'utilisation de @JsonAnySetter/@JsonAnyGetter proposé dans autre réponse semble être la voie à suivre.

13
M. Justin