如何使用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
是一种值得记住的可能性