web-dev-qa-db-fra.com

Jackson JsonNode à la collection typée

Quelle est la bonne façon de convertir un Jackson JsonNode en une collection Java?

S'il s'agissait d'une chaîne json, je pourrais utiliser ObjectMapper.readValue(String, TypeReference) mais pour un JsonNode les seules options sont ObjectMapper.treeToValue(TreeNode, Class) qui ne donnerait pas de collection typée, ou ObjectMapper.convertValue(Object, JavaType) qui se sent mal en raison de son acceptation de tout POJO pour la conversion.

Y a-t-il une autre manière "correcte" ou est-ce une de celles-ci?

15
kag0

Acquérir un ObjectReader avec ObjectMapper#readerFor(TypeReference) à l'aide d'un TypeReference décrivant la collection typée que vous vouloir. Utilisez ensuite ObjectReader#readValue(JsonNode) pour analyser JsonNode (vraisemblablement un ArrayNode ).

Par exemple, pour obtenir un List<String> sur un tableau JSON contenant uniquement des chaînes JSON

ObjectMapper mapper = new ObjectMapper();
// example JsonNode
JsonNode arrayNode = mapper.createArrayNode().add("one").add("two");
// acquire reader for the right type
ObjectReader reader = mapper.readerFor(new TypeReference<List<String>>() {
});
// use it
List<String> list = reader.readValue(arrayNode);
25

La fonction ObjectMapper.convertValue () est pratique et sensible au type. Il peut effectuer un large éventail de conversions entre les nœuds d'arbre et Java types/collections, et vice-versa.

Un exemple de la façon dont vous pourriez l'utiliser:

List<String> list = new ArrayList<>();
list.add("one");
list.add("two");

Map<String,List<String>> hashMap = new HashMap<>();
hashMap.put("myList", list);

ObjectMapper mapper = new ObjectMapper();
ObjectNode objectNode = mapper.convertValue(hashMap, ObjectNode.class);
Map<String,List<String>> hashMap2 = mapper.convertValue(objectNode, HashMap.class);
1
DanJ