如何使用jq将JSON对象列表合并为单个大对象?
如何将jq输出合并为单个对象?
问题背景
现有如下格式的JSON数组数据:
[ { "sys_replace_on_upgrade": "false", "initial_state": "false", "sys_mod_count": "0", "sys_updated_on": "2020-09-02 13:48:39", "sys_tags": "", "state_label": "Authorize", "sys_class_name": "sttrm_state", "state_sequence": "3", "sys_id": "13fc0801c343101035ae3f52c1d3ae77", "sys_update_name": "sttrm_state_13fc0801c343101035ae3f52c1d3ae77", "sys_updated_by": "admin", "sys_created_on": "2020-09-02 13:48:39", "sys_name": "Authorize", "state_value": "-3", "sys_customer_update": "false", "sys_created_by": "admin", "sys_policy": "" }, ... ]
使用当前jq命令处理后,输出是多个独立的小对象:
jq '.result[]|{(.sys_name) : .state_value}' states.json
输出结果:
{ "Authorize": "-3" } { "New": "-5" } { "Closed": "3" } { "Review": "0" } ...
但实际需要将所有键值对合并为单个大对象,格式如下:
{ "Authorize": "-3" , "New": "-5", "Closed": "3", "Review": "0", ... }
修改后的jq命令
只需将当前命令用合并操作整合所有小对象即可,推荐两种实用方式:
方式1:使用reduce遍历合并
jq '.result | reduce .[] as $item ({}; . + {($item.sys_name): $item.state_value})' states.json
- 逻辑:从空对象
{}起始,遍历数组每个元素,逐个将元素生成的键值对合并到结果对象中。
方式2:使用map+add批量合并
jq '.result | map({(.sys_name): .state_value}) | add' states.json
- 逻辑:先用
map把数组每个元素转换成单个键值对的小对象,再用add将所有小对象合并为一个大对象。
两种方式都能得到目标格式的单个对象,可根据习惯选择使用。
内容的提问来源于stack exchange,提问作者Simply Seth
相关产品推荐
相关产品推荐

