Je suis en train de sérialiser/désérialiser un Map<?, ?>
avec un objet arbitraire en tant que clés avec Jackson version 2.8. La contrepartie JSON doit être un tableau de couples, soit donnéComment désérialiser une carte <?, ?> avec Jackson?
public class Foo {
public String foo;
public Foo(String foo) {
this.foo = foo;
}
}
public class Bar {
public String bar;
public Bar(String bar) {
this.bar = bar;
}
}
puis
Map<Foo, Bar> map;
map.put(new Foo("foo1"), new Bar("bar1"));
map.put(new Foo("foo2"), new Bar("bar2"));
devrait être représenté par cette JSON
[
[ { "foo": "foo1" }, { "bar": "bar1" } ],
[ { "foo": "foo2" }, { "bar": "bar2" } ]
]
J'ai donc fait la partie sérialiseur comme
public class MapToArraySerializer extends JsonSerializer<Map<?, ?>> {
@Override
public void serialize(Map<?, ?> value, JsonGenerator gen, SerializerProvider serializers)
throws IOException, JsonProcessingException {
gen.writeStartArray();
for (Map.Entry<?, ?> entry : value.entrySet()) {
gen.writeStartArray();
gen.writeObject(entry.getKey());
gen.writeObject(entry.getValue());
gen.writeEndArray();
}
gen.writeEndArray();
}
}
mais j'ai aucune idée de comment écrire un JsonDeserializer
pour faire le travail inverse. Aucune suggestion?
Note: Je dois la notation [ [ "key1", "value1" ], [ "key2", "value2" ] ]
pour être en mesure de consommer que JSON en JavaScript et une new Map(...)
JSON.stringify(map)
produirait aussi que la notation (voir https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map).
Pour clarifier, une telle carte serait un champ d'autres classes, par ex.
public class Baz {
@JsonSerialize(using = MapToArraySerializer.class)
@JsonDeserialize(using = ArrayToMapDeserializer.class, keyAs = Foo.class, contentAs = Bar.class)
Map<Foo, Bar> map;
}
et ArrayToMapDeserializer extends JsonDeserializer<Map<?, ?>>
est où je demande de l'aide.
Je pense que vous êtes sur le compliquer. Votre JSON n'est pas une carte. Pourquoi utilisez-vous une 'Map' pour le représenter? Est-ce que 'Foo' et' Bar' ont des attributs qui les rendent différents? –
Dans les scénarios de cas d'utilisation réelle, Foo et Bar sont des objets complexes et une carte avec Foo comme type de clé peut être un champ d'un autre objet. J'ai besoin de porter ces cartes Java en JavaScript, qui a son propre 'Map' qui sérialise sous cette forme (voir le lien vers MDN dans la question). –
Oui, ils pourraient être des objets totalement différents (n'importe quel objet Java). J'ai mis à jour la question pour que ce soit clair! –