首页 > 解决方案 > 查询后从jsonpath数组中提取单个元素

问题描述

我正在尝试使用 json-path 从 json 字符串中提取一个值。我怀疑我的问题与应用谓词后从 JSONPath 数组结果中获取特定对象有关,但链接没有为我提供答案。我的 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=='yesterday')].all.count" 返回 [3] (逻辑上),我认为从结果数组中获取第一个元素就足够了,但我的结果数组总是空的。我做错了什么?

标签: javajsonpath

解决方案


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);

推荐阅读