我正在尝试用Java解析JSON ArrayNode,但是遇到了一些问题。
对象如下:
{
"type": "type",
"id": "id",
"attributes": {
"x": [ "x.value" ],
"y": [ "y.value" ],
"z": [ "z.value" ]
}
}
我解析如下:
Map<String, Map<String, String>> users = new HashMap<>();
Iterator<JsonNode> arrayIterator = dataArray.elements();
while (arrayIterator.hasNext())
{
JsonNode r = arrayIterator.next();
String id = r.get("id").asText();
users.put(id, new HashMap<>());
Iterator<JsonNode> attributeIterator = r.path("attributes").elements();
while (attributeIterator.hasNext())
{
JsonNode attribute = attributeIterator.next();
users.get(id).put(attribute.asText(),
attribute.elements().next().asText());
}
}
但是我正在得到一张这样的地图:
"" => z.value
我在Java文档中发现,如果属性.asText()
不是值节点,它将返回empty
。如何获取该名称,以便我的地图改为:
x => x.value
y => y.value
z => z.value
答案 0 :(得分:1)
首先,您需要JSON的键。因此,我尝试使用fields
而不是仅使用elements
Iterator<Map.Entry<String, JsonNode>> attributeIterator = dataArray.path("attributes").fields();
while (attributeIterator.hasNext())
{
Map.Entry<String, JsonNode> attribute = attributeIterator.next();
users.get(id).put(attribute.getKey(),
attribute.getValue().get(0).asText());
}
我不喜欢获取数组,所以我改成这个
Iterator<Map.Entry<String, JsonNode>> attributeIterator = dataArray.path("attributes").fields();
while (attributeIterator.hasNext())
{
Map.Entry<String, JsonNode> attribute = attributeIterator.next();
users.get(id).put(attribute.getKey(),
attribute.getValue().elements().next().textValue());
}
之所以使用fields
是因为我需要键值:
迭代器,可用于遍历对象的所有键/值对 节点其他类型的空迭代器(无内容)
并且elements
不包含键:
访问此节点的所有值节点的方法,前提是此节点是 JSON数组或对象节点。对于“对象”节点,字段名称 (键),不包括在内。对于其他类型的节点, 返回空的迭代器。
这将填满地图。我使用了jackson 2.9.4