Jackson JsonNode
をJavaコレクションに変換する適切な方法は何ですか?
JSON文字列の場合、ObjectMapper.readValue(String, TypeReference)
を使用できますが、JsonNode
の場合、オプションはObjectMapper.treeToValue(TreeNode, Class)
のみです。これは、型付きコレクションを提供しないか、ObjectMapper.convertValue(Object, JavaType)
変換のためにPOJOを受け入れるため、これは間違っていると感じています。
別の「正しい」方法はありますか、それともこれらの1つですか?
ObjectReader
を ObjectMapper#readerFor(TypeReference)
で取得し、 TypeReference
を使用して必要な型付きコレクションの説明。次に ObjectReader#readValue(JsonNode)
を使用して JsonNode
(おそらく ArrayNode
)。
たとえば、List<String>
JSON文字列のみを含む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);
ObjectMapper.convertValue()関数は便利で型を認識します。ツリーノードとJavaタイプ/コレクション、およびその逆)の間で幅広い変換を実行できます。
使用方法の例:
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);