JSONata新手求助:如何从嵌套对象中提取数据
Hey there! 作为JSONata新手,从嵌套对象里提取数据确实得先摸透它的路径语法和遍历技巧,我结合你给出的示例对象(先补全为合法JSON),给你演示几种最常用的提取场景~
先补全你的示例JSON(确保可测试)
{ "transaction": { "id": "de112b4b-82e2-4172-a89f-68724c90b692" }, "domain": { "id": "realworld" }, "listing": { "spanner": { "information": { "type": { "VENDOR": "Charlie" }, "variables": {}, "uid": "08_spanner", "mode": { "store": "bob" }, "version": "1", "name": "Harrold" } }, "hammer": { "information": { "type": { "VENDOR": "Cliff" }, "variables": {}, "uid": "08_hammer", "mode": { "store": "alice" }, "version": "1", "name": "Henry" } } } }
1. 提取单个深层字段
如果只需要某一个特定嵌套值,直接写完整路径就行:
- 提取spanner的供应商名称:
结果:listing.spanner.information.type.VENDOR"Charlie" - 提取交易ID:
结果:transaction.id"de112b4b-82e2-4172-a89f-68724c90b692"
2. 批量提取同结构的嵌套数据(所有工具信息)
因为listing下的spanner、hammer是同结构的工具节点,用*通配符遍历所有子对象,再整理成你需要的格式:
listing.*.information.{ "tool_name": $keys(listing)[$$], // 获取当前工具的名称(spanner/hammer) "vendor": type.VENDOR, "uid": uid, "store": mode.store, "tool_label": name }
返回结果(结构化数组):
[ { "tool_name": "spanner", "vendor": "Charlie", "uid": "08_spanner", "store": "bob", "tool_label": "Harrold" }, { "tool_name": "hammer", "vendor": "Cliff", "uid": "08_hammer", "store": "alice", "tool_label": "Henry" } ]
小提示:
$$代表当前遍历的上下文索引,配合$keys(listing)就能拿到工具的键名。
3. 过滤特定条件的数据
如果只想提取符合条件的工具(比如store为"bob"的工具),直接在路径后加过滤条件:
listing.*.information[mode.store = "bob"].{ "tool": $keys(listing)[$$], "vendor": type.VENDOR, "uid": uid }
返回结果:
[ { "tool": "spanner", "vendor": "Charlie", "uid": "08_spanner" } ]
4. 整合多维度数据(扁平化输出)
如果需要把顶层的交易、域信息和工具数据整合到一个对象里:
{ "transaction_id": transaction.id, "domain_id": domain.id, "tool_list": listing.*.information.{ "vendor": type.VENDOR, "uid": uid } }
返回结果:
{ "transaction_id": "de112b4b-82e2-4172-a89f-68724c90b692", "domain_id": "realworld", "tool_list": [ { "vendor": "Charlie", "uid": "08_spanner" }, { "vendor": "Cliff", "uid": "08_hammer" } ] }
内容的提问来源于stack exchange,提问作者thechane
相关产品推荐
相关产品推荐

