Java JSONPath:提取数组的子集会产生奇怪的结果
我有一个json:Java JSONPath:提取数组的子集会产生奇怪的结果,java,groovy,jsonpath,json-path-expression,Java,Groovy,Jsonpath,Json Path Expression,我有一个json: { "push": { "changes": [ { "commits": [ { "hash": "b194ab92186b94de3f9493818c353e9bbedb38d4" } ] } ] } } 而且,我有下面的jq代码
{
"push": {
"changes": [
{
"commits": [
{
"hash": "b194ab92186b94de3f9493818c353e9bbedb38d4"
}
]
}
]
}
}
而且,我有下面的jq代码,运行良好
cbongiorno at 5cg6203867 in ~/dev/sterling/pipeaas on master [+!?]
$ jq -re '.push.changes[].commits[].hash ' push.json # golden hash
b194ab92186b94de3f9493818c353e9bbedb38d4
这就是我想要的
我现在尝试使用JSONPath等价物,这就是它变得奇怪的地方:
如果I,则使用哈希值获取和数组大小1:
$.push.changes[*].commits[*].hash
[
"b194ab92186b94de3f9493818c353e9bbedb38d4"
]
这就产生了一个数组,然后我就可以对这个数组进行索引,对吗
$.push.changes[*].commits[*].hash[0]
[
"b"
]
我得到字母b
——因此现在它将字符串视为字符数组
所以,也许这是一个实现问题。我在groovy中尝试了相同的路径表达式,得到了一些不同的结果:
在jsonpath.groovy中
@Grab(group = 'com.jayway.jsonpath', module = 'json-path', version = '2.4.0')
import com.jayway.jsonpath.*
stuff = JsonPath.parse(new File('push.json')).read('$.push.changes[*].commits[*].hash')
println(stuff)
$groovy jsonpath.groovy
[b194ab92186b94de3f9493818c353e9bbedb38d4]
好的,我们又有了阵列。现在,让我们得到1个元素:
@Grab(group = 'com.jayway.jsonpath', module = 'json-path', version = '2.4.0')
import com.jayway.jsonpath.*
stuff = JsonPath.parse(new File('push.json')).read('$.push.changes[*].commits[*].hash[0]')
println(stuff)
$groovy jsonpath.groovy
[]
那么现在,好像这个阵列什么都没有
那么,如何将单个数组项作为路径表达式获取呢?您的问题还不够清楚。但是,您表达式的行为是正确的。您的
commits
是一个数组,因此您可以像commits[*]
或commits[0]
那样操作它。但是散列
字段不是数组。因此,JSONPath
将其视为字符数组
我猜您希望从commits
数组中获得正确的哈希值。所以你只需要你的表情像:
$.push.changes[*].committes[1]。散列
然后假设您的JSON对象如下所示:
{
"push": {
"changes": [
{
"commits": [
{
"hash": "b194ab92186b94de3f9493818c353e9bbedb38d4"
},
{
"hash":"secondHash"
}
]
}
]
}
}
结果将是:
[
"secondHash"
]
您可以使用:
$.push.changes[0].commits[0].hash
获取该层次结构中的“第一个”散列
[*]
的行为类似于GroovyFWIW中的扩展运算符,如果表达式push.changes[0]。提交[0]。值(@)[0]
输出“b194ab92186b94de3f9493818c353e9bbedb38d4”
。我没有选择。使用JSONPath对于集成是必要的,我很高兴被证明是错误的,但我不认为用JSONPath可以做到。我现在发现了完全相同的事情。如果我想要一个扁平的列表,元素0,我该怎么做呢?如果你能更新答案那就太好了。我的意思是,你答对了,所以你赢了奖,但是一些颜色会很好