Как извлечь конкретное поле из массива JSON с помощью jq - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу обработать данные JSON, используя jq.Вот выдержка из данных:

{
  "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"
    }
  ]
}

Мне нужно извлечь поля lat, lon и name, например:

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

I 'м почти там, но я не могу понять, как выбрать поле из массива, используя select().Кто-нибудь может указать мне правильное направление?

Большое спасибо,

Энно

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Хорошо, я понял:

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

Хитрость заключалась в том, чтобы использовать .tag[], который умножает каждую запись на количество элементов массива в .tag, затем для выбора соответствующих записей и затем дляпостроить выходной JSON.Спасибо за подсказку, @peak!

0 голосов
/ 06 февраля 2019

В зависимости от ваших точных требований, вы можете использовать map(select(...)) или .[] | select(...), например:

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

Возможно, вы захотите сделать это более надежным, например, взявучитывать возможность того, что может быть не одно «имя»:

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