Insomnia中JSONPath Plus语法问题:无法提取多层级多值
问题描述
我有如下简化JSON结构:
{ "data": { "jobs": [ { "jobId": "85c9f596-85f5-4ffa-8b94-2cde23162ddf", "jobNotes": { "note1": "Some note 1", "note2": "Some note 2" } }, // ... 其他job对象 ] } }
我希望在Insomnia中使用JSONPath Plus语法提取出如下格式的数据:
{ "jobId": "job1", "jobNotes": [ { "stuff":"blah", "stuff2": "3" } ] }
核心需求是获取所有存在jobNotes的jobId及其关联的jobNotes数据。
我尝试了以下语法,但返回[]:
data.jobs[*].['jobId', 'jobNotes'][?(@.jobNotes != null)]
使用的Insomnia版本信息:
Version: Insomnia 2023.5.8 Build date: 9/7/2023 OS: Darwin arm64 22.6.0 Electron: 25.2.0 Node: 18.15.0 Node ABI: 116 V8: 11.4.183.23-electron.0 Architecture: arm64
解决方案
你的语法问题在于过滤条件位置错误,且属性选择写法有误。以下是两种符合需求的正确写法:
1. 保留原始jobNotes对象结构
如果只需提取符合条件的jobId和原始jobNotes对象,使用:
data.jobs[?(@.jobNotes != null)].[jobId, jobNotes]
逻辑说明
data.jobs[?(@.jobNotes != null)]:先过滤出所有包含非空jobNotes的job元素.[jobId, jobNotes]:从过滤后的元素中提取指定字段
返回结果示例:
[ { "jobId": "85c9f596-85f5-4ffa-8b94-2cde23162ddf", "jobNotes": { "note1": "Some note 1", "note2": "Some note 2" } } ]
2. 将jobNotes转为数组格式(匹配目标输出)
如果需要把原始jobNotes对象转换成你示例中的数组结构,结合$map函数处理:
data.jobs[?(@.jobNotes != null)].{jobId: jobId, jobNotes: $map(@.jobNotes, (v,k) => ({stuff: k, stuff2: v}))}
逻辑说明
$map(@.jobNotes, (v,k) => ({stuff: k, stuff2: v})):把jobNotes的每个键值对转换成{stuff: 键名, stuff2: 值}的对象,再组合成数组
返回结果示例:
[ { "jobId": "85c9f596-85f5-4ffa-8b94-2cde23162ddf", "jobNotes": [ {"stuff": "note1", "stuff2": "Some note 1"}, {"stuff": "note2", "stuff2": "Some note 2"} ] } ]
原语法失效原因
- 过滤条件位置错误:你先提取了所有job的字段,再试图过滤,但JSONPath Plus要求先过滤再提取字段
- 属性选择写法有误:
.[后多了空格,且字段名无需额外加单引号(加了不影响,但空格会导致语法错误)
内容的提问来源于stack exchange,提问作者DeanS
相关产品推荐
相关产品推荐

