Excuses als ik iets heel duidelijks over het hoofd heb gezien; Ik heb zojuist jq
gevonden en probeer het te gebruiken om één JSON-waarde bij te werken zonder de omringende gegevens te beïnvloeden.
Ik wil een curl
resultaat naar jq
pipen, een waarde bijwerken en de bijgewerkte JSON doorsluizen naar een curl -X PUT
. Iets als
curl http://example.com/shipping.json | jq '.' field: value | curl -X PUT http://example.com/shipping.json
Tot nu toe heb ik het samen gehackt met behulp van sed
, maar na het bekijken van een paar voorbeelden van de |=
operator in jq
ik weet zeker dat ik deze niet nodig heb.
Hier is een JSON-voorbeeld: hoe zou ik jq
gebruiken om "local": false
in te stellen, terwijl ik de rest van de JSON behoud?
{
"shipping": {
"local": true,
"us": true,
"us_rate": {
"amount": "0.00",
"currency": "USD",
"symbol": "$"
}
}
}
Antwoord 1, autoriteit 100%
Je stelt waarden van een object in met de operator =
. |=
daarentegen wordt gebruikt om een waarde bij te werken. Het is een subtiel maar belangrijk verschil. De context van de filters verandert.
Omdat u een eigenschap instelt op een constante waarde, gebruikt u de operator =
.
.shipping.local = false
Houd er rekening mee dat wanneer u een waarde voor een eigenschap instelt, deze niet per se hoeft te bestaan. U kunt op deze manier eenvoudig nieuwe waarden toevoegen.
.shipping.local = false | .shipping.canada = false | .shipping.mexico = true
Antwoord 2, autoriteit 36%
Een waarde bijwerken (zet .foo.bar in op “nieuwe waarde”):
jq '.foo.bar = "new value"' file.json
Een waarde bijwerken met behulp van een variabele (zet .foo.bar in op “hallo”):
variable="hello"; jq --arg variable "$variable" '.foo.bar = $variable' file.json
Antwoord 3, autoriteit 7%
een soortgelijke functie als de operator |= is map.
map zal geschikt zijn om de eis van een eerder filter voor de array te vermijden…
stel je voor dat je gegevens een array zijn (heel gebruikelijk in dit voorbeeld)
[
{
"shipping": {
"local": true,
"us": true,
"us_rate": {
"amount": "1.00",
"currency": "USD",
"symbol": "$"
}
}
},
{
"shipping": {
"local": true,
"us": true,
"us_rate": {
"amount": "1.00",
"currency": "USD",
"symbol": "$"
}
}
}
]
daarom is het noodzakelijk om de array in de code te beschouwen als:
http://example.com/shipping.json | jq '.[] | .shipping.local = "new place"' | curl -X PUT http://example.com/shipping.json
of om de kaartfunctie te gebruiken die is gemaakt om in elk array-element te werken als
http://example.com/shipping.json | jq 'map(.shipping.local = "new place")' | curl -X PUT http://example.com/shipping.json
Observatie
In het belang van degenen die aan het leren zijn, heb je ook enkele fouten gemaakt in het gebruik van jq, bedenk dat het de 1e parameter als het programma “leest”, daarom zullen alle gewenste commando’s in de allereerste string worden opgenomen na het aanroepen van het programma.