我正在尝试压缩由嵌套对象组成的JSON。顶层包含多个键/值对,其中每个值本身是一个包含多个对象(底层)的数组。
我想使用jq获取的只是一个包含底层所有对象的对象数组,每个对象都有一个额外的键/值对,用于标识它最初属于的顶层键。 / p>
换句话说,我想转一个JSON
{
"key1": [obj1, obj2],
"key2": [obj3]
}
进入普通数组
[OBJ1, OBJ2, OBJ3]
其中每个OBJi
只是具有额外键/值对的原始对象
"parent-key-name": keyx
其中keyx
属于顶层密钥obji
,即"key1"
和obj1
obj2
以及"key2"
obj3
。
我正在努力解决这个问题,即当引用底层的对象时,例如通过。[],jq似乎没有内置功能来访问相关的顶层信息。但是,我是jq的新手,希望毕竟有一个简单的解决方案。
答案 0 :(得分:2)
给出以下输入:
{
"key1": [{"name":"Emma"},{"name":"Bob"}],
"key2": [{"name":"Jean"}]
}
您可以将项目划分为条目,将密钥存储在变量中,并为value
对象中的每个项目添加值:
jq '[ to_entries[] | .key as $parent | .value[] |
.["parent-key-name"] |= (.+ $parent) ] ' test.json
给出以下输出:
[
{
"name": "Emma",
"parent-key-name": "key1"
},
{
"name": "Bob",
"parent-key-name": "key1"
},
{
"name": "Jean",
"parent-key-name": "key2"
}
]
答案 1 :(得分:1)
下面介绍的解决方案包含两个步骤,每个步骤可能分别有用,例如:如果有人想要"压扁" JSON的方式略有不同。
首先,让我们对obj [i]"就地"进行更改:
with_entries(.key as $ k | .value [] | =(。+ {" parent-key-name":$ k}))
示例:
$ jq -n -c -f program.jq
输入: { " key1":[{a:1},{a:2}], " key2":[{b:3}] }
输出:
{
"key1": [
{
"a": 1,
"parent-key-name": "key1"
},
{
"a": 2,
"parent-key-name": "key1"
}
],
"key2": [
{
"b": 3,
"parent-key-name": "key2"
}
]
}
要展平,只需将| [.[]]
附加到上面的过滤器即可。这会产生:
[[{"":1,"父密钥名称":" KEY1"},{"&#34 ;: 2,"父密钥名称":" KEY1"}],[{" b":3,"父密钥名称&#34 ;:" KEY2"}]]