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

标签 java jsonpath

我正在尝试使用 json-path 从 json 字符串中提取值。 我怀疑我的问题与 Get specific object from JSONPath array result after predicate is applied 有关但该链接没有为我提供答案。我的 json 文件如下所示:

{
  "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] (逻辑上),我假设从结果数组中取出第一个元素就足够了,但我的结果数组始终为空。 我做错了什么?

最佳答案

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

关于java - 查询后从 jsonpath 数组中提取单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50768925/

相关文章:

java - 如何在java中使用JSonPath删除json键值

java - 如何使用 PowerMockito 模拟私有(private)字段?

Java - 不能从静态上下文中引用

xml - 无法使用 json-eval 在 WSO2 ESB 配置中应用 concat 函数

javascript - 验证 json 负载中元素的值

JSONPath 表达式 : getting the value of a specific attribute based on it's presence or the value of another attribute

java - 如何使用 jsonpath 计算成员?

r - 无法并行运行bartMachine

java - 更快的自动完成/即时搜索 Java 移动应用程序

java - 有没有办法暂时隐藏或禁用平视通知?