使用 JayWay JSONPath 在不同深度提取多个 JSON 对象
Extract several JSON objects at different depths with JayWay JSONPath
情况
- 我有一个JSON
- 我试图获取数组中具有某些特定嵌套对象的每个元素。困难的部分是其中一些对象嵌套在不同的深度。
- 我正在使用 JayWay JsonPath https://github.com/json-path/JsonPath, and my code works exactly like https://jsonpath.herokuapp.com
这是为了在我们的平台上使用,https://dashdash.com - 一个集成了已知网络服务(以及您的私有 API)的电子表格。
特殊情况(可测试)
考虑以下来源JSON,我只想return具有嵌套对象B、C和G的数组元素。G是开的与 B 和 C 不同的深度。
您可以在下面看到 return 的来源和 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"
}
]
}
}
]
预期return选项1。
[
{
"B":"val2",
"C":"val3",
"G":[
{
"H":"val5",
"I":"val6",
"J":"val7"
}
]
},
{
"B":"val9",
"C":"val10",
"G":[
{
"H":"val12",
"I":"val13",
"J":"val14"
}
]
}
]
预期 return 选项 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']
: return 为空。
$..['B','C',['D'].['G']]
: return只有G里面的对象.
同样,我正在使用 JayWay JsonPath https://github.com/json-path/JsonPath, and my code works exactly like 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
如果您需要任何进一步的帮助,请告诉我。
我一直在尝试一些不同的方法,我认为更简单的表达式可以解决问题:
$.*[?(@.B && @.C && @.D.G)]
除默认配置外,不需要任何特殊配置(根据在 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"
}
]
}
}
]
你怎么看?
情况
- 我有一个JSON
- 我试图获取数组中具有某些特定嵌套对象的每个元素。困难的部分是其中一些对象嵌套在不同的深度。
- 我正在使用 JayWay JsonPath https://github.com/json-path/JsonPath, and my code works exactly like https://jsonpath.herokuapp.com
这是为了在我们的平台上使用,https://dashdash.com - 一个集成了已知网络服务(以及您的私有 API)的电子表格。
特殊情况(可测试)
考虑以下来源JSON,我只想return具有嵌套对象B、C和G的数组元素。G是开的与 B 和 C 不同的深度。
您可以在下面看到 return 的来源和 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"
}
]
}
}
]
预期return选项1。
[
{
"B":"val2",
"C":"val3",
"G":[
{
"H":"val5",
"I":"val6",
"J":"val7"
}
]
},
{
"B":"val9",
"C":"val10",
"G":[
{
"H":"val12",
"I":"val13",
"J":"val14"
}
]
}
]
预期 return 选项 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']
: return 为空。$..['B','C',['D'].['G']]
: return只有G里面的对象.
同样,我正在使用 JayWay JsonPath https://github.com/json-path/JsonPath, and my code works exactly like 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
如果您需要任何进一步的帮助,请告诉我。
我一直在尝试一些不同的方法,我认为更简单的表达式可以解决问题:
$.*[?(@.B && @.C && @.D.G)]
除默认配置外,不需要任何特殊配置(根据在 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"
}
]
}
}
]
你怎么看?