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