java json 取节点路径_Java-Jackson JSON:从JSON获取节点名称

Java-Jackson JSON:从JSON获取节点名称

如何使用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

}

}

谢谢。

5个解决方案

66 votes

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

Iterator> nodes = rootNode.get("foo").fields();

while (nodes.hasNext()) {

Map.Entry entry = (Map.Entry) nodes.next();

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

}

Supun Sameera answered 2020-02-10T02:30:53Z

63 votes

此答案适用于2+之前的Jackson版本(最初写为1.8)。 请参阅@SupunSameera的答案,以获取与较新版本的Jackson兼容的版本。

“节点名称”的JSON术语是“键”。 自"foo"不包含键,您需要进行不同的迭代:

for (Map.Entry elt : rootNode.fields())

{

if ("foo".equals(elt.getKey()))

{

// bar

}

}

如果只需要查看键,则可以使用"foo"进行一些简化:

for (String key : rootNode.fieldNames())

{

if ("foo".equals(key))

{

// bar

}

}

并且,如果您只想查找键为"foo"的节点,则可以直接访问它。 与使用循环相比,这将产生更好的性能(恒定时间查找)和更清晰的代码:

JsonNode foo = rootNode.get("foo");

if (foo != null)

{

// frob that widget

}

Matt Ball answered 2020-02-10T02:30:34Z

11 votes

field()和fieldNames()都不适合我。 而且我不得不花一些时间来找到一种迭代密钥的方法。 有两种方法可以完成它。

一种是将其转换为地图(占用更多空间):

ObjectMapper mapper = new ObjectMapper();

Map result = mapper.convertValue(jsonNode, Map.class);

for (String key : result.keySet())

{

if(key.equals(foo))

{

//code here

}

}

另一个,通过使用String迭代器:

Iterator it = jsonNode.getFieldNames();

while (it.hasNext())

{

String key = it.next();

if (key.equals(foo))

{

//code here

}

}

Anna Shekhawat answered 2020-02-10T02:31:22Z

7 votes

在这里澄清:

尽管这将起作用:

JsonNode rootNode = objectMapper.readTree(file);

Iterator> fields = rootNode.fields();

while (fields.hasNext()) {

Map.Entry entry = fields.next();

log.info(entry.getKey() + ":" + entry.getValue())

}

这不会:

JsonNode rootNode = objectMapper.readTree(file);

while (rootNode.fields().hasNext()) {

Map.Entry entry = rootNode.fields().next();

log.info(entry.getKey() + ":" + entry.getValue())

}

因此,请小心声明fasterxml为变量,并使用该变量。

确保使用fasterxml库而不是codehaus。

ChrisGeo answered 2020-02-10T02:32:00Z

0 votes

JsonNode root = mapper.readTree(json);

root.at("/some-node").fields().forEachRemaining(e -> {

System.out.println(e.getKey()+"---"+ e.getValue());

});

一站式杰克逊2+

nash answered 2020-02-10T02:32:20Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值