web-dev-qa-db-ja.com

Jackson JsonNodeからCollectionを入力する

Jackson JsonNodeをJavaコレクションに変換する適切な方法は何ですか?

JSON文字列の場合、ObjectMapper.readValue(String, TypeReference)を使用できますが、JsonNodeの場合、オプションはObjectMapper.treeToValue(TreeNode, Class)のみです。これは、型付きコレクションを提供しないか、ObjectMapper.convertValue(Object, JavaType)変換のためにPOJOを受け入れるため、これは間違っていると感じています。

別の「正しい」方法はありますか、それともこれらの1つですか?

15
kag0

ObjectReaderObjectMapper#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);
25

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