2016-03-22 6 views
3

Ich muss den Wert einer Schlüsselgruppe (definiert in einer Variablen) in einem JSON-Objekt mithilfe von jq ändern.Ändern von JSON-Werten basierend auf einem Array von Schlüsseln mithilfe von jq

Als Beispiel habe ich dieses JSON-Objekt:

{ 
    foo: { 
     bar: 1, 
     baz: 2, 
     qux: 3 
    } 
} 

und die folgende Variable:

update_keys = ["bar", "baz"] 

Ich mag würde sagen, 'den Wert der Schlüssel in update_keys zu X ändern'.

Die folgenden Werke:

.foo = (.foo | 
     to_entries | 
     map(if .key == "bar" or .key == "baz" 
     then . + { "value":"X" } 
     else . 
     end) | 
     from_entries) 

Aber statt if .key == "bar" or .key == "baz" ich nach einem Weg suchen if .key in update_keys zu sagen, oder eine ähnliche Logik.

+0

Können Sie näher erläutern, was das Ergebnis sein sollte. Nicht sicher, ob Sie update_keys erweitern oder ändern möchten.foo –

+0

Ich möchte foo aktualisieren, indem ich die Werte der im Array update_keys definierten Schlüssel ändere (alle Schlüssel ändern sich auf den gleichen Wert) – fusio

+0

Ist 'update_keys' bereits eine Variable, die du in' jq' definiert hast? –

Antwort

1

Hier gehen Sie.

Filter

.foo |= with_entries(.value = if ([.key] | inside(["bar", "baz"])) then "X" else .value end) 

Eingang

{ 
    "foo": { 
     "bar": 1, 
     "baz": 2, 
     "qux": 3 
    } 
} 

Output

{ 
    "foo": { 
    "bar": "X", 
    "baz": "X", 
    "qux": 3 
    } 
} 

Prüfen des Kochbuch für mehr recipies out und Techniken der jq Nutzung:
https://github.com/stedolan/jq/wiki/Cookbook

+0

oh wow, danke: D – fusio

0

Hier ist ein etwas anderer Ansatz --argjson mit update_keys parametrieren und index/1:

$ cat update.jq 
.foo |= with_entries(. as $in 
      | if $update_keys | index($in.key) then .value = "X" else empty end) 

$ update_keys='["bar", "baz"]' 

$ jq --argjson update_keys "$update_keys" -f update.jq input.json 

Output: 

{ 
    "foo": { 
    "bar": "X", 
    "baz": "X" 
    } 
} 
0

In diesem Problem, da $update_keys ist nur ein Array alles, was benötigt wird, ist

.foo[ $update_keys[] ] = "X" 

z wenn

["bar","baz"] as $update_keys 
| .foo[ $update_keys[] ] = "X" 

in filter.jq und data.json enthält die (slighty korrigiert) Daten

{ 
    "foo": { 
    "bar": 1, 
    "baz": 2, 
    "qux": 3 
    } 
} 

dann

jq -M -f filter.jq data.json 

{ 
    "foo": { 
    "bar": "X", 
    "baz": "X", 
    "qux": 3 
    } 
} 

produziert Wenn Sie pa wollen ss in den Wert für Update-Schlüssel, anstatt es in Ihrem Skript zu definieren, können Sie einfach --argjson als peak 's Antwort zeigt.

Verwandte Themen