如何使用jq从JSON数组中提取特定字段

时间:2019-02-06 16:20:34

标签: arrays select jq

我想使用jq处理JSON数据。以下是数据摘录:

{
  "lat": "49.3877286",
  "lon": "6.704062",
  "tag": [
    {
      "k": "name",
      "v": "Beckingen"
    },
    {
      "k": "is_in",
      "v": "Merzig-Wadern,Saarland,Bundesrepublik Deutschland,Europe"
    },
    {
      "k": "place",
      "v": "town"
    },
  ]
}
{
  "lat": "49.287307",
  "lon": "6.8827786",
  "tag": [
    {
      "k": "name",
      "v": "Püttlingen"
    },
    {
      "k": "place",
      "v": "town"
    },
    {
      "k": "population",
      "v": "18748"
    }
  ]
}

我需要提取latlonname字段,如下所示:

{
  "lat": "49.3877286",
  "lon": "6.704062",
  "name": "Beckingen"
},
{
  "lat": "49.287307",
  "lon": "6.8827786",
  "name": "Püttlingen"
}

我快到了,但是我不知道如何使用select()从数组中选择一个字段。谁能指出我正确的方向?

非常感谢,

Enno

2 个答案:

答案 0 :(得分:1)

根据您的确切要求,您可以使用map(select(...)).[] | select(...),例如:

.tag[] | select(.k == "name") | .v

您可能希望使其更加健壮,例如,考虑到可能没有确切的一个“名称”的可能性:

first(.tag[] | select(.k == "name") | .v // null)

答案 1 :(得分:0)

好吧,我明白了

{lat: .lat, lon: .lon, tag: .tag[]}
| select(.tag.k=="name") 
| {lat: .lat, lon: .lon, name: .tag.v}

诀窍是使用.tag[]将每个条目与.tag中的数组元素数量相乘,然后选择相关条目,然后构造输出JSON。感谢提示,@ peak!