Парсер jq json добавляет поле JSON на основе условий

У меня есть следующий входной файл:

[
{
    "macAddress": "22:00:10:21:ca:54",
    "GeoCoordinate": {
        "latitude": 1.2345,
        "longitude": 123.4567,
        "unit": "DEGREES"
    }
},
{
    "macAddress": "44:00:10:21:ca:14"
},
{
    "macAddress": "33:00:11:21:ca:54",
    "GeoCoordinate": {
        "latitude": 2.1345544523,
        "longitude": 123.45678,
        "unit": "DEGREES"
    }
},
...
]

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

[
"created_at": "2016-04-13T14:50:03+0800", 
{
    "macAddress": "22:00:10:21:ca:54",
    "GeoCoordinate": {
        "latitude": 1.2345,
        "longitude": 123.4567,
        "unit": "DEGREES"
    },
    "loc": {
        "lon": 123.4567,
        "lat": 1.2345
    }
},
{
    "macAddress": "44:00:10:21:ca:14"
},
{
    "macAddress": "33:00:11:21:ca:54",
    "GeoCoordinate": {
        "latitude": 2.1345544523,
        "longitude": 123.45678,
        "unit": "DEGREES"
    },
    "loc": {
        "lon": 123.45678,
        "lat": 2.1345544523
    }
},
...
]

Вы можете видеть, что я вставил поле created_at.

Я также добавил пару широта/долгота на основе условия существования поля GeoCoordinate.

Как использовать jq для этого?


person Xianlin    schedule 19.04.2016    source источник
comment
Желаемый результат недействителен json. Вы не можете поместить свойство в массив. ISODate("2016-04-13T14:50:03+0800") не является допустимым значением json.   -  person Jeff Mercado    schedule 19.04.2016
comment
@JeffMercado, я изменил вывод на действительный json после прочтения вашего комментария.   -  person Xianlin    schedule 19.04.2016
comment
Ваш вывод по-прежнему недействителен json. [ "foo: "bar", { "a" : "b", ... }] недействителен.   -  person hek2mgl    schedule 19.04.2016


Ответы (1)


Условное добавление пары широта/долгота должно быть простым. Просто проверьте, есть ли у вас значение GeoCoordinate, и добавьте пару. Ваше свойство created_at недействительно в этом месте, поэтому самое близкое, что мы можем сделать:

{
    created_at: now | todate,
    results: map(
        if .GeoCoordinate then
            .loc = (.GeoCoordinate | { lon: .longitude, lat: .latitude })
        else
            .
        end
    )
}

Это даст следующие результаты:

{
  "created_at": "2016-04-19T20:09:35Z",
  "results": [
    {
      "macAddress": "22:00:10:21:ca:54",
      "GeoCoordinate": {
        "latitude": 1.2345,
        "longitude": 123.4567,
        "unit": "DEGREES"
      },
      "loc": {
        "lon": 123.4567,
        "lat": 1.2345
      }
    },
    {
      "macAddress": "44:00:10:21:ca:14"
    },
    {
      "macAddress": "33:00:11:21:ca:54",
      "GeoCoordinate": {
        "latitude": 2.1345544523,
        "longitude": 123.45678,
        "unit": "DEGREES"
      },
      "loc": {
        "lon": 123.45678,
        "lat": 2.1345544523
      }
    }
  ]
}
person Jeff Mercado    schedule 19.04.2016