如何从嵌套结构JSON的results列表中提取指定field对应的value?
问题:提取指定字段的value值
需要从以下JSON数据的results列表的每个子列表中,提取所有field等于@logStream的对象的value值:
{ "results": [ [ { "field": "@logStream", "value": "i-0d41c4f2b294fae88-messages" }, { "field": "@ptr", "value": "CmEKJgoiMTI1NzEwNTIwMzE3OkRhdGFJbmdlc3QtZW50ZXJwcmlzZRAHEjUaGAIGPjW1igAAAACsKl4NAAY/k4KwAAAAoiABKIzAjqzoMDC5+ZGs6DA4D0DrEEi4C1DlBxgAEA4YAQ==" } ] ], "statistics": { "recordsMatched": 94761, "recordsScanned": 94761, "bytesScanned": 13659575 }, "status": "Complete" }
尝试过的表达式及错误结果:
- 表达式:
results[].[field==@logStream]
返回布尔值数组:[ [ true ], [ false ] ] - 表达式:
results[].[field==@logStream].value
返回:[ null ] - 表达式:
results[].[field==@logStream].[value]
返回:null
期望结果:
[ [ { "value": "i-0d41c4f2b294fae88-messages" } ] ]
解决方案:正确的JMESPath表达式
要实现需求,需要使用JMESPath的过滤表达式([?条件])来筛选符合要求的对象,而非直接做布尔比较:
1. 匹配期望结果(仅保留value字段的对象):
results[].[?field == '@logStream'].{value: value}
2. 保留完整符合条件的对象(包含field和value):
results[].[?field == '@logStream']
失败原因说明:
- 直接写
field==@logStream``只会返回每个对象的布尔比较结果,而非过滤出对象本身; - 基于布尔值去访问
.value属性,自然会得到null,因为布尔类型没有该属性。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

