如何使用jq从嵌套的JSON对象派生动态键?
我使用如何使用jq从嵌套的JSON对象派生动态键?,json,dynamic,nested,key,jq,Json,Dynamic,Nested,Key,Jq,我使用jq转换JSON输入,其中包含以下格式的嵌套动态键: { "somePackage": { "someVersion": { "size": { "regular": 1234, "compressed": 123 } } }, "someOtherPackage": { &quo
jq
转换JSON输入,其中包含以下格式的嵌套动态键:
{
"somePackage": {
"someVersion": {
"size": {
"regular": 1234,
"compressed": 123
}
}
},
"someOtherPackage": {
"someOtherVersion": {
"size": {
"regular": 5678,
"compressed": 567
}
}
}
}
[
{
"name": "somePackage",
"version": "someVersion",
"regular": 1234,
"compressed": 123
},
{
"name": "someOtherPackage",
"version": "someOtherVersion",
"regular": 5678,
"compressed": 567
}
]
。。。转换为以下格式的对象数组:
{
"somePackage": {
"someVersion": {
"size": {
"regular": 1234,
"compressed": 123
}
}
},
"someOtherPackage": {
"someOtherVersion": {
"size": {
"regular": 5678,
"compressed": 567
}
}
}
}
[
{
"name": "somePackage",
"version": "someVersion",
"regular": 1234,
"compressed": 123
},
{
"name": "someOtherPackage",
"version": "someOtherVersion",
"regular": 5678,
"compressed": 567
}
]
我已成功地通过以下方式实现了这一目标:
jq 'to_entries | map_values({
name: .key,
version: .value|keys[0],
regular: .value[.value|keys[0]].size.regular,
compressed: .value[.value|keys[0]].size.compressed
})' input.json
有没有一种方法可以访问原始JSON中每个级别的动态键,这样我就可以在输出中使用它们作为值,而不需要太多重复?您可以使用jq所谓的“$-变量”,例如 您还可以为
.value[$innerkey].size引入一个变量,或者更好地简化:
to_entries
| map_values(
(.value|keys[0]) as $innerkey
| { name: .key, version: $innerkey }
+ .value[$innerkey].size )
请注意,keys
对键进行排序,因此,尽管在这种情况下没有多大关系,但使用keys\u unsorted
是一种值得记住的可能性