我在 Java 中有一个 json 结构,其中包含不同类别下相似对象的重复列表,我想使用 JsonPath 进行查询:
{"root":
{"cars":[
{"make":"Ford", "colour":"white", "doors":4},
{"make":"Audi", "colour":"silver","doors":2}
],
"vans":[
{"make":"Ford", "colour":"blue", "weight":2}
]
}}
我想返回第三辆车的颜色,所以希望这样做:
$.root.[cars,vans][2].colour
但似乎 [cars,vans] 表达式返回一个数组数组,而不是所有车辆的单个联合/连接数组,并且索引运算符 [2] 分别应用于每个汽车和货车数组(什么都不返回),而不是它们的联合(应该返回货车)。
$.root.[cars,vans][0].colour
返回第一辆汽车和第一辆货车,同时
$.root.[cars,vans][0].colour[0]
返回第一辆车和第一辆货车每种颜色的第一个字母,
$.root.[cars,vans][1].colour
仅返回第二辆车。
类似地,使用通配符会返回相同的数组数组:
$.root.*[0].colour
有没有办法合并 [cars,vans] 联合的结果,例如通过使用:
$.root.[[cars,vans]][2].colour
或者我是否需要编写自己的 Java 实现之一的改编代码?
在 JSONPath 中你无法得到你期望的结果,最好的 JSONPath 可以做的是
$..colour
返回一个像这样的数组 ["white","silver","blue"]
然后你可以在你的程序中进一步计算数组的第三个元素。
或者您可以使用 JMESPATH 通过以下查询来解决此问题:
@.root.[*][][].colour | [2]
,它会准确返回 blue
。
或者您可以使用 jq 通过以下查询来解决此问题:
.root | flatten | .[2].colour
,它会准确返回blue
。