Jackson JSON:从 json-tree 获取节点名称

2022-08-31 16:46:48

如何使用 Jackson 从 JSON 树接收节点名称?JSON 文件如下所示:

{  
    node1:"value1",
    node2:"value2",
    node3:{  
        node3.1:"value3.1",
        node3.2:"value3.2"
    }
}

我有

JsonNode rootNode = mapper.readTree(fileReader);

并且需要类似的东西

for (JsonNode node : rootNode){
    if (node.getName().equals("foo"){
        //bar
  }
}

谢谢。


答案 1

对于 Jackson 2+ (),方法略有不同:com.fasterxml.jackson

Iterator<Entry<String, JsonNode>> nodes = rootNode.get("foo").fields();

while (nodes.hasNext()) {
  Map.Entry<String, JsonNode> entry = (Map.Entry<String, JsonNode>) nodes.next();

  logger.info("key --> " + entry.getKey() + " value-->" + entry.getValue());
}

答案 2

这个答案适用于2+之前的杰克逊版本(最初是为1.8编写的)。请参阅@SupunSameera的答案,了解适用于较新版本的杰克逊的版本。


“节点名称”的 JSON 术语是“密钥”。由于 JsonNode#iterator() 不包含键,因此您需要以不同的方式进行迭代

for (Map.Entry<String, JsonNode> elt : rootNode.fields())
{
    if ("foo".equals(elt.getKey()))
    {
        // bar
    }
}

如果你只需要看到密钥,你可以用JsonNode#fieldNames()简化一些事情:

for (String key : rootNode.fieldNames())
{
    if ("foo".equals(key))
    {
        // bar
    }
}

如果您只想找到带有密钥的节点,则可以直接访问它。这将产生比使用循环更好的性能(恒定时间查找)和更干净/更清晰的代码:"foo"

JsonNode foo = rootNode.get("foo");
if (foo != null)
{
    // frob that widget
}