2016-04-19 12 views
0

ich die folgenden Eingabedatei haben:jq json Parser anhängt JSON Feld auf Bedingungen basieren

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

Ich möchte jq Programm verwenden, um die JSON zu analysieren, um die unter Ausgabe

[ 
"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 
    } 
}, 
... 
] 

Sie bekommen kann sehen, dass ich created_at Feld eingefügt habe.

Ich habe auch lat/long Paar basierend auf der Bedingung der GeoCoordinate Feld vorhanden oder nicht hinzugefügt.

Wie verwendet man jq, um das zu erreichen?

+1

Ihre gewünschte Ausgabe nicht gültig json ist. Sie können keine Eigenschaft in ein Array einfügen. 'ISODate (" 2016-04-13T14: 50: 03 + 0800 ")' ist kein gültiger JSON-Wert. –

+0

@JeffMercado, ich habe die Ausgabe in gültige JSON nach dem Lesen Ihres Kommentars geändert. – Xianlin

+0

Ihre Ausgabe ist immer noch nicht gültig json. '[" foo: "bar", {"a": "b", ...}] 'ist ungültig. – hek2mgl

Antwort

1

Bedingt das Hinzufügen des lat/long Paares sollte einfach sein. Überprüfen Sie einfach, ob Sie einen GeoCoordinate Wert haben und fügen Sie das Paar hinzu. Ihre created_at Eigenschaft ist an dieser Stelle ungültig ist, so ist hier in der Nähe, die wir tun können:

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

Dies würde die folgenden Ergebnisse liefern:

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