![](/img/trans.png)
[英]How to conditionally extract a Json value using JayWay JsonPath?
[英]Extract several JSON objects at different depths with JayWay JSONPath
这将在我们的平台https://dashdash.com上使用 -与已知Web服务(以及您的私有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','D']
我尝试提取B,C和G,但以下所有查询均失败:
$..['B','C','G']
:返回null。 $..['B','C',['D'].['G']]
:仅返回$..['B','C',['D'].['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"
}
]
}
}
]
请参阅证据,并注意将return null选项设置为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"
}
]
}
}
]
你怎么看?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.