gpt4 book ai didi

java - 如何使用 Jackson 和 JsonPointer 查找具有动态节点名称的值

转载 作者:搜寻专家 更新时间:2023-11-01 03:34:22 25 4
gpt4 key购买 nike

我正在使用 Jackson (版本 2.6+)解析一些看起来像这样的丑陋 JSON:

{ 
"root" : {
"dynamic123" : "Some value"
}
}

不幸的是,dynamic123 属性的名称直到运行时才为人所知,并且可能会不时发生变化。我想要实现的是使用 JsonPointer获取值 "Some value"JsonPointer使用类似 XPath 的语法,即 described here .

// { "root" : { "dynamic123" : "Some value" } }
ObjectNode json = mapper.createObjectNode();
json.set("root", json.objectNode().put("dynamic123", "Some value"));

// Some basics
JsonNode document = json.at(""); // Ok, the entire document
JsonNode missing = json.at("/missing"); // MissingNode (as expected)
JsonNode root = json.at("/root"); // Ok -> { dynamic123 : "Some value" }

// Now, how do I get a hold of the value under "dynamic123" when I don't
// know the name of the node (since it is dynamic)
JsonNode obvious = json.at("/root/dynamic123"); // Duh, works. But the attribute name is unfortunately unknown so I can't use this
JsonNode rootWithSlash = json.at("/root/"); // MissingNode, does not work
JsonNode zeroIndex = json.at("/root[0]"); // MissingNode, not an array
JsonNode zeroIndexAfterSlash = json.at("/root/[0]"); // MissingNode, does not work

那么,现在回答我的问题。有没有一种方法可以使用 JsonPointer 检索值 "Some value"

显然还有其他检索值的方法。一种可能的方法是使用 JsonNode 遍历函数——例如像这样:

JsonNode root = json.at("/root");
JsonNode value = Optional.of(root)
.filter(d -> d.fieldNames().hasNext()) // verify that there are any entries
.map(d -> d.fieldNames().next()) // get hold of the dynamic name
.map(name -> root.get(name)) // lookup of the value
.orElse(MissingNode.getInstance()); // if it is missing

但是,我试图避免遍历并且只使用 JsonPointer .

最佳答案

我不认为the JsonPointer specification支持通配符。这是非常基本的。相反,您可以考虑使用 JsonPath与 jackson map 提供商。这是一个例子:

public class JacksonJsonPath {
public static void main(String[] args) {
final ObjectMapper objectMapper = new ObjectMapper();
final Configuration config = Configuration.builder()
.jsonProvider(new JacksonJsonNodeJsonProvider())
.mappingProvider(new JacksonMappingProvider())
.build();

// { "root" : { "dynamic123" : "Some value" } }
ObjectNode json = objectMapper.createObjectNode();
json.set("root", json.objectNode().put("dynamic123", "Some value"));

final ArrayNode result = JsonPath
.using(config)
.parse(json).read("$.root.*", ArrayNode.class);
System.out.println(result.get(0).asText());
}
}

输出:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Some value

关于java - 如何使用 Jackson 和 JsonPointer 查找具有动态节点名称的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35771141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com