2

我有这个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,这就是它变得奇怪的地方:如果我在这里尝试,我得到和数组大小为 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 
[]

所以现在,就好像数组什么都没有?!

那么,如何将这个单个数组项作为路径表达式?

4

2 回答 2

1

你的问题不够清楚。但是,你表达的行为是正确的。你commits是一个数组,所以你可以表现得像commits[*]or commits[0]。但是该hash字段不是数组。正因为如此JSONPath对待它arrays of characters

我猜你想hashcommits数组中得到正确的。所以你只需要你的表达就像:

$.push.changes[*].commits[1].hash

然后假设你的 JSON 对象是这样的:

{
  "push": {
    "changes": [
      {
        "commits": [
          {
            "hash": "b194ab92186b94de3f9493818c353e9bbedb38d4"
          },
          {
              "hash":"secondHash"
          }
        ]
      }
    ]
  }
}

结果将是:

[
  "secondHash"
]
于 2020-07-29T04:29:09.217 回答
1

您可以使用:

$.push.changes[0].commits[0].hash

获取该层次结构中的“第一个”哈希。

[*]行为类似于 Groovy 中的扩展运算符

于 2020-07-29T07:48:10.353 回答