Ich habe die folgende Eingabedatei:
{
"dic": {
"a": "",
"b": "",
"c": "",
"d": ""
},
"remove": {
"b": true,
"c": false,
"d": true
}
}
Ich möchte mit jq alle Elemente des Wörterbuchs dic
entfernen, die sich ebenfalls im Wörterbuch remove
mit dem Wert true befinden.
Dies wäre die Ausgabe:
{
"dic": {
"a": "",
"c": ""
},
"remove": {
"b": true,
"c": false,
"d": true
}
}
Ich bin mir nicht sicher, wie ich das machen soll. Ich müsste zuerst das remove
dic bereinigen und nur die Schlüssel mit dem Wert true erhalten. Dann müsste ich irgendwie nur diese Schlüssel aus dic
löschen.
3 Antworten
Sie brauchen dafür nichts anderes als JQ.
[.remove | path(.[] | select(.))] as $p | .dic |= delpaths($p)
Wenn in remove
möglicherweise andere Werte als true und false enthalten sind, verwenden Sie
select(. == true)
Anstatt von
select(.)
Hier ist eine einfache und effiziente Lösung, die nur jq verwendet:
(.remove | with_entries(select(.value == true))) as $remove
| .dic |= with_entries(select($remove[.key] | not))
Dies kann mit Bash-Loops erfolgen:
#!/bin/bash
# saving the json so we can manipulate it freely
data="$(cat data.json)"
for k in $(echo "$data" | jq '.remove' | jq -r keys[]) # getting all the keys from remove
do
# skipping the key if it isn't supposed to be removed
[ $(echo "$data" | jq .remove.$k) == 'false' ] && continue
data="$(echo "$data" | jq "del(.dic.$k)")" # removing the key
done
echo "$data" # final json without the keys
Verwandte Fragen
Neue Fragen
json
JSON (JavaScript Object Notation) ist ein serialisierbares Datenaustauschformat, das maschinen- und lesbar sein soll. Verwenden Sie dieses Tag nicht für native JavaScript-Objekte oder JavaScript-Objektliterale. Bevor Sie eine Frage stellen, überprüfen Sie Ihren JSON mit einem JSON-Validator wie JSONLint (https://jsonlint.com).