gpt4 book ai didi

java - 使用 JayWay JSONPath 提取不同深度的多个 JSON 对象

转载 作者:行者123 更新时间:2023-11-30 06:02:18 32 4
gpt4 key购买 nike

情况

这是在我们的平台上使用的,https://dashdash.com - 集成了已知 Web 服务(以及您的私有(private) API)的电子表格。

特殊情况(可测试)

考虑以下源 JSON,我只想返回具有嵌套对象 B、C 和 G 的数组元素。G 的深度与 B 和 C 不同。

下面您可以看到来源和返回的 2 个选项。

源 JSON

[  
{
"A":"val1",
"B":"val2",
"C":"val3",
"D":{
"E":[
{
"F":"val4"
}
],
"G":[
{
"H":"val5",
"I":"val6",
"J":"val7"
}
]
}
},
{
"A":"val8",
"B":"val9",
"C":"val10",
"D":{
"E":[
{
"F":"val11"
}
],
"G":[
{
"H":"val12",
"I":"val13",
"J":"val14"
}
]
}
},
{
"A":"val15",
"B":"val16"
},
{
"A":"val8",
"B":"val9",
"C":"val10",
"D":{
"E":[
{
"F":"val11"
}
]
}
}
]

预期返回选项 1。

[
{
"B":"val2",
"C":"val3",
"G":[
{
"H":"val5",
"I":"val6",
"J":"val7"
}
]
},
{
"B":"val9",
"C":"val10",
"G":[
{
"H":"val12",
"I":"val13",
"J":"val14"
}
]
}
]

预期返回选项 2。

[
{
"B":"val2",
"C":"val3",
"D":{
"E":[
{
"F":"val4"
}
],
"G":[
{
"H":"val5",
"I":"val6",
"J":"val7"
}
]
}
},
{
"B":"val9",
"C":"val10",
"D":{
"E":[
{
"F":"val11"
}
],
"G":[
{
"H":"val12",
"I":"val13",
"J":"val14"
}
]
}
}
]

我在哪里

  • 我可以使用查询 $..['B','C','D'] 提取包含 B、C 和 D 的所有数组元素

我尝试提取 B、C 和 G,但以下所有查询均失败:

  • $..['B','C','G']:返回 null。
  • $..['B','C',['D'].['G']]:仅返回 G 内的对象。

我再次使用 JayWay JsonPath https://github.com/json-path/JsonPath ,我的代码的工作方式与 https://jsonpath.herokuapp.com 完全相同。

提前致谢

最佳答案

您可以通过将 JayWay 设置为 DEFAULT_PATH_LEAF_TO_NULL 配置(如官方文档中所述: https://github.com/json-path/JsonPath )来解决此问题,然后应用空比较评估:

像这样:

$.[?(@.A != null && @.B != null && @.D != null &&  @.D.G != null)]

或者这个:

$.[?((@.A != null && @.B != null) && ((@.D != null &&  @.D.G != null) || (@.G != null)))]

对于设置DEFAULT_PATH_LEAF_TO_NULL,您应该更改默认配置:

Configuration conf = Configuration.defaultConfiguration();
Configuration conf2 = conf.addOptions(Option.DEFAULT_PATH_LEAF_TO_NULL);

注意:如果您使用的是 jayway 的旧版本,则比较运算符无法正常工作,要获取更多信息,请参阅 https://code.google.com/archive/p/json-path/issues/27

我测试了这个解决方案并且对我来说效果很好:

测试在 https://jsonpath.herokuapp.com/ 上进行输入以下内容:

[  
{
"A":"val1",
"B":"val2",
"C":"val3",
"D":{
"E":[
{
"F":"val4"
}
],
"G":[
{
"H":"val5",
"I":"val6",
"J":"val7"
}
]
}
},
{
"A":"val8",
"B":"val9",
"C":"val10",
"D":{
"E":[
{
"F":"val11"
}
],
"G":[
{
"H":"val12",
"I":"val13",
"J":"val14"
}
]
}
},
{
"A":"val15",
"B":"val16"
},
{
"A":"val8",
"B":"val9",
"C":"val10",
"D":{
"E":[
{
"F":"val11"
}
]
}
}
]

结果是:

[
{
"A" : "val1",
"B" : "val2",
"C" : "val3",
"D" : {
"E" : [
{
"F" : "val4"
}
],
"G" : [
{
"H" : "val5",
"I" : "val6",
"J" : "val7"
}
]
}
},
{
"A" : "val8",
"B" : "val9",
"C" : "val10",
"D" : {
"E" : [
{
"F" : "val11"
}
],
"G" : [
{
"H" : "val12",
"I" : "val13",
"J" : "val14"
}
]
}
}
]

See the evidence and note that returning null option is set to true

如果您需要任何进一步的帮助,请告诉我。

关于java - 使用 JayWay JSONPath 提取不同深度的多个 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55265388/

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