簡體   English   中英

如何使用 jq 將 JSON 解析為單個嵌套對象?

[英]How to parse JSON into a single nested object with jq?

我正在嘗試使用 jq 解析 JSON 文件,但我無法正確解析。 如何將以下 JSON 解析為:

  • 單個嵌套對象,並添加額外的頂級鍵(示例中的“城市”、“烏普薩拉”和“位置”)
  • 使用鍵name的值作為對象的鍵?

(源 json 的縮短版本):

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "name": "Uppsala domkyrka"
      },
      "geometry": {
        "coordinates": [
          17.6336159,
          59.8581466
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "name": "Uppsala moské"
      },
      "geometry": {
        "coordinates": [
          17.6382165,
          59.874003
        ]
      }
    }
  ]
}

我正在嘗試將其解析為這種格式

{
  "cities": {
    "uppsala": {
      "locations": {
        "Uppsala domkyrka": {
          "name": "Uppsala domkyrka",
          "coordinates": {
            "_latitude": 59.854,
            "_longitude": 17.6261
          }
        },
        "Uppsala moské": {
          "name": "Uppsala moské",
          "coordinates": {
            "_latitude": 59.8581,
            "_longitude": 17.6336
          }
        }
      }
    }
  }
}

這是我到目前為止到達的命令:

[.features[] | {name: .properties.name, coordinates: {_latitude: .geometry.coordinates[0], _longitude: .geometry.coordinates[1]}}]

要產生這個,這是不太正確的:

[
  {
    "name": "Uppsala domkyrka",
    "coordinates": {
      "_latitude": 17.6336159,
      "_longitude": 59.8581466
    }
  },
  {
    "name": "Uppsala moské",
    "coordinates": {
      "_latitude": 17.6382165,
      "_longitude": 59.874003
    }
  }
]

我還沒有設法將name的值作為對象的鍵。

有任何想法嗎? 我已經讀了幾個小時,然后把頭發拉出來。。

由於您想對三個最頂層的鍵進行硬編碼,因此解決方案的關鍵是add

{
  "cities": {
    "uppsala": {
      "locations":
        [.features[]
         | {name: .properties.name,
            coordinates:
              {_latitude: .geometry.coordinates[0],
               _longitude: .geometry.coordinates[1]
              }
            }
         | {(.name): .}
        ] | add
    }
  }
}

如果您不想要name的冗余,您可以將{(.name): .}替換為:

{(.name): del(.name)}

更緊湊的變體

上面的關鍵add有點丟失,所以你可能想考慮這個等效的替代方案:

[.features[]
 | {name: .properties.name,
    coordinates:
      { _latitude: .geometry.coordinates[0],
        _longitude: .geometry.coordinates[1]
      }
   } | {(.name): .} ]
| add as $v
| ({} | .cities.uppsala.locations = $v)

暫無
暫無

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

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