如何使用jq将嵌套JSON的多消息数组转换为按id排序的单数组?
使用JQ转换JSON结构的纯JQ解决方案
需求概述
将原JSON中_internal_messages下的error、info、success三个数组合并为单一数组,为每条消息添加type字段标识原类型,并最终按id字段升序排列。
原JSON结构
{ "_internal_messages": { "error": [ { "date": "16:12:30 - 07/02/2023", "id": 1, "origin": "A", "text": "This is an error message" }, { "date": "16:12:31 - 07/02/2023", "id": 5, "origin": "A", "text": "This is a second error message" } ], "info": [ { "date": "16:12:29 - 07/02/2023", "id": 0, "origin": "A", "text": "This is an info message" }, { "date": "16:12:30 - 07/02/2023", "id": 4, "origin": "C", "text": "This is a second info message" } ], "success": [ { "date": "16:12:30 - 07/02/2023", "id": 2, "origin": "B", "text": "This is a success message" }, { "date": "16:12:30 - 07/02/2023", "id": 3, "origin": "B", "text": "This is a second success message" }, { "date": "16:12:31 - 07/02/2023", "id": 6, "origin": "C", "text": "This is a third success message" } ] } }
目标JSON结构
{"_internal_messages":[ { "type":"info", "date": "16:12:29 - 07/02/2023", "id": 0, "origin": "A", "text": "This is an info message" },{ "type":"error", "date": "16:12:30 - 07/02/2023", "id": 1, "origin": "A", "text": "This is an error message" },{ "type":"success", "date": "16:12:30 - 07/02/2023", "id": 2, "origin": "B", "text": "This is a success message" },{ "type":"success", "date": "16:12:30 - 07/02/2023", "id": 3, "origin": "B", "text": "This is a second success message" },{ "type":"info", "date": "16:12:30 - 07/02/2023", "id": 4, "origin": "C", "text": "This is a second info message" },{ "type":"error", "date": "16:12:31 - 07/02/2023", "id": 5, "origin": "A", "text": "This is a second error message" },{ "type":"success", "date": "16:12:31 - 07/02/2023", "id": 6, "origin": "C", "text": "This is a third success message" } ]}
纯JQ处理命令
jq '{_internal_messages: [._internal_messages | to_entries[] | .value[] + {type: .key}] | sort_by(.id)}'
命令分步解释
._internal_messages | to_entries[]:把原_internal_messages下的error/info/success键值对转换为{key: "类型名", value: 对应数组}的结构,遍历所有键值对.value[] + {type: .key}:遍历每个类型数组里的消息对象,为每个对象新增type字段,字段值就是原类型名[...]:将所有处理后的消息对象整合为一个数组| sort_by(.id):对这个数组按id字段从小到大排序{_internal_messages: ...}:把排序后的数组包装成最终的JSON结构,保持顶层键名不变
内容的提问来源于stack exchange,提问作者Bianca Luxambio
相关产品推荐
相关产品推荐

