簡體   English   中英

如何使用 jq 從嵌套的 JSON 對象派生動態密鑰?

[英]How do I derive dynamic keys from a nested JSON object with jq?

我正在使用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
  }
]

我已經設法做到了:

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 所謂的“$-variables”,例如

to_entries
| map_values(
    (.value|keys[0]) as $innerkey
    | { name: .key,
        version: $innerkey,
        regular: .value[$innerkey].size.regular,
        compressed: .value[$innerkey].size.compressed
})

您還可以為.value[$innerkey].size引入一個變量,或者更好的是,簡化:

to_entries
| map_values(
    (.value|keys[0]) as $innerkey
    | { name: .key, version: $innerkey }
      + .value[$innerkey].size )

請注意, keyskeys排序,因此盡管在這種情況下這無關緊要,但使用keys_unsorted是一種值得記住的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM