Przepraszam, jeśli przeoczyłem coś bardzo oczywistego; Właśnie znalazłem jq
i próbuję go użyć do zaktualizowania jednej wartości JSON bez wpływu na otaczające dane.
Chciałbym przesłać curl
wynik do jq
, zaktualizować wartość i przesłać zaktualizowany kod JSON do pliku curl -X PUT
. Coś jak
curl http://example.com/shipping.json | jq '.' field: value | curl -X PUT http://example.com/shipping.json
Do tej pory zhakowałem to razem za pomocą sed
, ale po obejrzeniu kilku przykładów |=
operatora w jq
jestem pewien, że ich nie potrzebuję.
Oto przykład JSON - jak użyłbym jq
ustawienia "local": false
, zachowując resztę JSON?
{
"shipping": {
"local": true,
"us": true,
"us_rate": {
"amount": "0.00",
"currency": "USD",
"symbol": "$"
}
}
}
"
, na przykład.shipping.local = "new place"
. Więc całe polecenie będziecurl http://example.com/shipping.json | jq '.shipping.local = "new place"'
. W przeciwnym razie otrzymasz dziwne błędy.false
. Wartości nie muszą być łańcuchami.false
. Co jest nie tak?.shipping.<INSERT VAR HERE>
gdzie VAR jest zdefiniowane w jq? Na prosty przykład, jak zmodyfikowałbyśjq --arg location local '.shipping.$location = false'
go, aby działał?.shipping[$location] = false
Zaktualizuj wartość (ustawia .foo.bar na „nową wartość”):
jq '.foo.bar = "new value"' file.json
Zaktualizuj wartość za pomocą zmiennej (ustawia .foo.bar na „hello”):
variable="hello"; jq --arg variable "$variable" '.foo.bar = $variable' file.json
źródło
podobną funkcją do operatora | = jest mapowanie. map będzie odpowiednia, aby uniknąć wymogu poprzedniego filtru dla tablicy ...
wyobraź sobie, że Twoje dane są tablicą (bardzo często w tym przykładzie)
[ { "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": "$" } } } ]
stąd konieczne jest rozważenie tablicy w kodzie jako:
http://example.com/shipping.json | jq '.[] | .shipping.local = "new place"' | curl -X PUT http://example.com/shipping.json
lub użyć funkcji mapy, która została stworzona do pracy w każdym elemencie tablicy jako
http://example.com/shipping.json | jq 'map(.shipping.local = "new place")' | curl -X PUT http://example.com/shipping.json
Obserwacja
Ze względu na tych, którzy się uczą, popełniłeś również błędy w używaniu jq, po prostu weź pod uwagę, że "odczytuje" pierwszy parametr jako program, stąd wszystkie pożądane polecenia powinny być zawarte w pierwszym ciągu po wywołaniu funkcji program.
źródło
.[].shipping.local = "new place"
?