如何使用jq将JSON解析为单个嵌套对象?

如何使用jq将JSON解析为单个嵌套对象?,json,jq,Json,Jq,我试图用jq解析一个JSON文件,但我不能正确地解析它。如何将以下JSON解析为: 单个嵌套对象,并添加其他顶级关键点(“示例中的城市”、“乌普萨拉”和“位置”) 是否将键名称的值用作对象的键 (源json的缩写版本): 我正在尝试将其解析为这种格式: { "cities": { "uppsala": { "locations": { "Uppsala domkyrka": { "name": "Uppsala domkyrka",

我试图用jq解析一个JSON文件,但我不能正确地解析它。如何将以下JSON解析为:

  • 单个嵌套对象,并添加其他顶级关键点(“示例中的城市”、“乌普萨拉”和“位置”)
  • 是否将键
    名称
    的值用作对象的键
(源json的缩写版本):

我正在尝试将其解析为这种格式

{
  "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
的值作为对象的键


有什么想法吗?我已经读了好几个小时了,真是毛骨悚然。

既然您想硬编码最上面的三个键,解决方案的关键是添加:

{
  "cities": {
    "uppsala": {
      "locations":
        [.features[]
         | {name: .properties.name,
            coordinates:
              {_latitude: .geometry.coordinates[0],
               _longitude: .geometry.coordinates[1]
              }
            }
         | {(.name): .}
        ] | add
    }
  }
}
如果您不想重复
名称
,可以将
{(.name):.}
替换为:

{(.name): del(.name)}
更紧凑的变体

“临界<代码>添加< /代码>在上面丢失了一点,所以您可能想考虑这个等价的替代方案:

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

您预期的输出不是有效的JSON,您不能有相同名称的重复密钥
ID
,感谢您及时指出@Inian和@peak,这显然是我的误解。我相信这是正确的,现在有意义了吗?
[.features[]
 | {name: .properties.name,
    coordinates:
      { _latitude: .geometry.coordinates[0],
        _longitude: .geometry.coordinates[1]
      }
   } | {(.name): .} ]
| add as $v
| ({} | .cities.uppsala.locations = $v)