如何用JMESPath提取子对象键名及指定属性的键值对
使用JMESPath转换嵌套对象为指定数组格式
问题场景
给定如下JSON结构:
{ "status": "VALUED", "prop_a": "something", "updated": "2024-04-15 09:16:55", "items": { "7": { "my_value": "value_one", "extra": "Mysterious Benefactor" }, "15": { "my_value": "value_two", "extra": "Awesome Awesomeness" }, "18": { "extra": "Dangling value" }, "19": { "my_value": "value_three", "a_number": "42", "extra": "Skippy the Magnificent" } } }
需要将items中的键值对转换为包含id(对应原键)和my_value的对象数组,可选择包含或排除无my_value的项。
解决方案
1. 仅保留存在my_value的项
使用以下JMESPath表达式:
items | entries(@) | [?value.my_value] | [{"id": key, "my_value": value.my_value}]
解析:
items | entries(@):将items对象转换为键值对数组,格式为[{"key": "7", "value": {...}}, ...][?value.my_value]:过滤出value中存在my_value字段的项[{"id": key, "my_value": value.my_value}]:将每个键值对映射为目标格式的对象
执行后结果:
[ { "id": "7", "my_value": "value_one" }, { "id": "15", "my_value": "value_two" }, { "id": "19", "my_value": "value_three" } ]
2. 包含所有项(无my_value的项设为null)
使用以下JMESPath表达式:
items | entries(@) | [{"id": key, "my_value": value.my_value || null}]
解析:
- 同样先通过
entries(@)转换为键值对数组 value.my_value || null:如果my_value不存在,自动填充为null
执行后结果:
[ { "id": "7", "my_value": "value_one" }, { "id": "15", "my_value": "value_two" }, { "id": "18", "my_value": null }, { "id": "19", "my_value": "value_three" } ]
关键说明
entries(@)是核心:它能将任意对象转换为键值对数组,完美解决原对象键不连续且需保留键作为id的需求- 表达式完全通用,不管
items中有多少项都能正常处理
内容的提问来源于stack exchange,提问作者StoneGiant
相关产品推荐
相关产品推荐

