JSON:解析数组的ArrayNode

时间:2018-07-12 14:06:45

标签: java arrays json parsing

我正在尝试用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

1 个答案:

答案 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数组或对象节点。对于“对象”节点,字段名称   (键),不包括在内。对于其他类型的节点,   返回空的迭代器。

来自Java Docs

这将填满地图。我使用了jackson 2.9.4