jq技术问题:如何为对象值数组元素添加父键并转为对象数组
使用jq转换JSON结构:将数组元素转为带父键的对象数组
原始JSON格式
{ "key1" : [ "key1item1", "key1item2", "key1item3", "key1item4" ], "key2" : [ "key2item1", "key2item2" ] }
期望转换结果
{ "key1" : [ { "parent": "key1", "key": "key1_key1item1", "value": "key1_item1" }, { "parent": "key1", "key": "key1_key1item2", "value": "key1_item2" }, { "parent": "key1", "key": "key1_key1item3", "value": "key1_item3" } ], "key2" : [ { "parent": "key2", "key": "key2_key2item1", "value": "key2_item1" }, { "parent": "key2", "key": "key2_key2item2", "value": "key2_item2" } ] }
实现的jq命令
jq 'to_entries | map({key: .key, value: .value[] | {parent: .key, key: "\(.key)_\(.)", value: "\(.key)_\(. | sub("^\\w+"; ""))"}}) | from_entries' input.json
命令拆解
to_entries:把原始键值对对象转成[{key: "key1", value: [...]}, ...]的数组结构,方便同时获取父键和对应元素数组map(...):遍历每个键值对,逐个处理数组元素:.value[]:展开数组里的每个元素,单独进行对象转换parent: .key:直接将当前父键赋值给parent字段key: "\(.key)_\(.)":用父键和当前元素拼接成新的key字段值value: "\(.key)_\(. | sub("^\\w+"; ""))":通过正则sub去掉元素开头的连续字母部分(比如key1item1去掉key1得到item1),再和父键拼接成value字段值
from_entries:把处理后的数组转换回原始的键值对对象结构
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

