Java JSONPath:提取数组的子集会产生奇怪的结果

Java JSONPath:提取数组的子集会产生奇怪的结果,java,groovy,jsonpath,json-path-expression,Java,Groovy,Jsonpath,Json Path Expression,我有一个json: { "push": { "changes": [ { "commits": [ { "hash": "b194ab92186b94de3f9493818c353e9bbedb38d4" } ] } ] } } 而且,我有下面的jq代码

我有一个json:

{
  "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
获取该层次结构中的“第一个”散列


[*]
的行为类似于Groovy

FWIW中的扩展运算符,如果表达式
push.changes[0]。提交[0]。值(@)[0]
输出
“b194ab92186b94de3f9493818c353e9bbedb38d4”
。我没有选择。使用JSONPath对于集成是必要的,我很高兴被证明是错误的,但我不认为用JSONPath可以做到。我现在发现了完全相同的事情。如果我想要一个扁平的列表,元素0,我该怎么做呢?如果你能更新答案那就太好了。我的意思是,你答对了,所以你赢了奖,但是一些颜色会很好