Hoe werk ik een enkele waarde in een json-document bij met jq?

Excuses als ik iets heel duidelijks over het hoofd heb gezien; Ik heb zojuist jqgevonden en probeer het te gebruiken om één JSON-waarde bij te werken zonder de omringende gegevens te beïnvloeden.

Ik wil een curlresultaat naar jqpipen, 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 jqik weet zeker dat ik deze niet nodig heb.

Hier is een JSON-voorbeeld: hoe zou ik jqgebruiken om "local": falsein 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.

Other episodes