查询后从jsonpath数组中提取单个元素

时间:2018-06-08 22:01:26

标签: java jsonpath

我正在尝试使用json-path从json字符串中提取值。 我怀疑我的问题与Get specific object from JSONPath array result after predicate is applied有关,但链接并没有为我提供答案。我的jsonfile看起来像这样:

{
  "success": true,
  "errorKey": null,
  "results": {
    "payments": [
      {
        "name": "current",
        "all": {
          "revenue": 390.32,
          "count": 1
        }
      },
      {
        "name": "sameYesterday",
        "all": {
          "revenue": 613.24,
          "count": 4
        }
      },
      {
        "name": "yesterday",
        "all": {
          "revenue": 613.24,
          "count": 3
        }
      }
    ]
  }
}

我希望获得昨天的付款计数。以下查询肯定有效,但它依赖于json数组中元素的位置,可以改变:

ReadContext ctx = JsonPath.parse(content);
ctx.read("$.results.payments[2].all.count");

我正在尝试使用名称匹配:

ctx.read("$.results.payments[?(@.name=='yesterday')].all.count[0]")

我的问题是这总是返回一个空数组。 ctx.read(" $。results.payments [?(@。name =='昨天')]。all.count"返回[3](逻辑上)我假设服用了结果数组中的第一个元素就足够了,但我的结果数组总是空的。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

count属性本身不是JSON中的数组,因此count上的数组表示法(例如count[0])不起作用。但是,在计算时,表达式$.results.payments[?(@.name == 'yesterday')].all.count返回一个Java列表,以便获得第一个count,我们可以从列表中获取第一个元素:

List<Integer> yesterdayCounts = ctx.read("$.results.payments[?(@.name == 'yesterday')].all.count");
int firstCount = yesterdayCounts.get(0);

assertThat(firstCount).isEqualTo(3);