如何用jq将JSON对象键转为属性并转数组及逆向转换?
使用jq实现JSON结构的双向转换
原始JSON结构
{ "item1": { "foo1": 1, "foo2": 2 }, "item2": { "foo1": 11, "foo2": 22 } }
正向转换:对象转带name属性的数组
要把上面的对象转换成包含name属性的JSON数组,用jq的entries方法就能搞定:
jq 'entries | map({name: .key} + .value)' input.json
逻辑说明:
entries:将原始键值对对象转换成[{"key": "item1", "value": {...}}, {"key": "item2", "value": {...}}]格式的数组map(...):遍历数组每个元素,把key赋值给name字段,再和原value合并,生成目标结构
转换后结果:
[ { "name": "item1", "foo1": 1, "foo2": 2 }, { "name": "item2", "foo1": 11, "foo2": 22 } ]
逆向转换:数组转回原始对象
要把数组还原成最初的键值对结构,用reduce方法遍历数组构建对象即可:
jq 'reduce .[] as $item ({}; .[$item.name] = ($item | del(.name)))' array.json
逻辑说明:
reduce .[] as $item ({}; ...):以空对象为初始值,逐个遍历数组中的元素$item.[$item.name] = ($item | del(.name)):把元素的name作为键,删除name字段后的剩余内容作为值,添加到初始对象中
执行后就能得到最开始的原始JSON结构。
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

