java - 查询后从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] (逻辑上),我认为从结果数组中获取第一个元素就足够了,但我的结果数组总是空的。我做错了什么?
解决方案
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 - postgresql 日期与 java Instant
- msbuild - Visual Studio 2017 - 如何使用附加的 DLL(不是文件)进行构建
- spring - 如何在应用程序中具有 JPA 的 Spring Boot 中使用 ElasticSearch,我是否必须从表中获取记录并将其放入 elasticsearch 的索引中?
- python - 使用 python3 指定放置下载文件的路径
- lua - Lua表成员函数在哪里定义
- c# - 无法加载类型 Microsoft.Bot.Builder.Internals.Fibers.SetField
- windows - 强制 Windows 进程更新其配置的方法(重新读取其注册表设置)
- json - REST 调用响应 HTTPS 状态 415
- python - 计算 if 循环的迭代次数
- sql - SQL查询以分隔用空值分隔的管道