2017-12-27 4 views
1

i mehrere json-Dateien im folgende Format als Umwelt-Dateien haben und es gegen einen Endpunkt zu testen,aktualisiert einen Wert in einer Liste von JSON-Objekten (einen bekannten Schlüssel entspricht) jq mit

{ 
    "id": "test1123", 
    "name": "my testing", 
    "values": [ 
    { 
     "enabled": true, 
     "key": "URL", 
     "value": "http://localhost:3000/", 
     "type": "text" 
    }, 
    { 
     "enabled": true, 
     "key": "User1Token", 
     "value": "", 
     "type": "text" 
    }, 
    { 
     "enabled": true, 
     "key": "User2Token", 
     "value": "", 
     "type": "text" 
    }, 
    { 
     "enabled": true, 
     "key": "IdentityURL", 
     "value": "", 
     "type": "text" 
    }, 
    { 
     "enabled": true, 
     "key": "AdminToken", 
     "value": "", 
     "type": "text" 
    } 
    ], 
    "timestamp": 1511892974802, 
    "_postman_variable_scope": "environment", 
    "_postman_exported_at": "2017-11-28T19:38:23.389Z", 
    "_postman_exported_using": "Postman/5.3.0" 
} 

Ich wollte um den Endpunkt in diesem json zu aktualisieren, bevor ich meinen Test ausführe. Der Endpunkt Wert muss auf Wertattribut von Werten hinzugefügt werden, Objekt, in dem der Schlüssel „URL“

so in dem obigen Fall, soll ich den Endpunkt in den ersten Indexwerten Array aktualisieren,

{ 
    "enabled": true, 
    "key": "URL", 
    "value": "http://10.20.200.1/", 
    "type": "text" 
} 

wo http://10.20.200.1/ ist mein Endpunkt.

Der aktuelle Code, den ich zu verwenden ist versucht:

jq '.values | map(if .key == "URL" then . + {"value":"10.20.13.28/";} else . end)' 

... aber dies führt zu einem Syntaxfehler. Kann mir jemand vorschlagen, wie man jq benutzt, um den Wert korrekt zu aktualisieren?

Hinweis: Die Schlüssel-URL ist nicht immer der erste Index der Werte.

+1

Können Sie den 'jq' Code anzeigen, den Sie ausprobiert haben? –

+0

jq '.values ​​| map (wenn .key == "URL" dann. + {"value": "http://10.20.13.28/"} else. end) '. Problem mit diesem ist die Ausgabe enthält nicht volle json, da ich nur Werte Wert betrachte – Annette

Antwort

1

Wenn Sie andere umgebende Schlüssel/Wert-Paare beibehalten und nur das Element values aktualisieren möchten, müssen Sie einen neuen Wert dafür berechnen. kann wie folgt aussehen, das zu tun:

jq \ 
    --arg updateKey "URL" \ 
    --arg updateVal "http://10.20.200.1" \ 
    '.values = [.values[] | if (.key == $updateKey) then (.value = $updateVal) else . end]' 
2

Das folgende ist nur eine Variation von @ CharlesDuffy des ausgezeichneten Antwort:

def when(c; f): if c? // null then f else . end; 

.values = map(when(.key == $updateKey; .value = $updateVal)) 

Diese Definition von when/2 ganz allgemein ist. Es fügt ein kleines Maß an Sicherheit hinzu und vermeidet die Langeweile von if _ then _ else . end. Es ist vielleicht Ihrer Standard-jq-Bibliothek würdig (z. B. ~/.jq oder ~/.jq/jq/jq.jq).

+0

Sehr nett - das ist praktisch in der Tat, und ich wusste nicht 'jq' geehrte dotfiles. :) –

+0

@CharlesDuffy - Leider ist die Situation mit ~/.jq derzeit ein wenig durcheinander. Siehe z.B. https://github.com/stedolan/jq/issues/1501 – peak

Verwandte Themen