A JSON objektum a többi nyelv terminológiájával élve egy „hash”, „map” vagy „szótár”.
A JSON a következőképpen definiálja az objektumot:
Az objektum név/érték párok rendezetlen halmaza. Az objektum
{bal kapcsos zárójellel kezdődik és}jobb kapcsos zárójellel végződik. Minden nevet:kettőspont követ, a név/érték párokat pedig,vessző választja el.
A név stringnek kell lennie. A név másik szava a kulcs.
Az érték bármilyen JSON-típusú lehet. Ugyanabban az objektumban a különböző értékek különböző típusúak lehetnek, mint ebben a példában.
{
"name": "Jane",
"age": 42,
"pets": ["cat", "fish"],
"address": {"street": "123 Main St", "city": "Springfield"}
}
Figyelj rá, hogy az utolsó kulcs-érték pár után nem lehet vessző.
A név/érték párok gyűjtéséhez kapcsos zárójeleket használj. Bár a neveknek stringnek kell lenniük, nem kell idézőjelbe tenni őket, ha a nevek azonosító jellegűek (alfanumerikus karakterekből és alulvonásból állnak, és nem számjeggyel kezdődnek).
{name: "Jane", age: 42}
Lehet olyan kulcsokat is használni, amelyek nem azonosító jellegűek. Csak tedd idézőjelbe őket.
{"first name": "Jane", "last name": "Lopez", age: 42}
Ha a név egy kifejezés eredménye, a kifejezést kötelező zárójelbe tenni.
$ echo "Jane" | jq -Rc '{.: 42}'
jq: error: syntax error, unexpected '.' (Unix shell quoting issues?) at <top-level>, line 1:
{.: 42}
jq: error: May need parentheses around object key expression at <top-level>, line 1:
{.: 42}
jq: 2 compile errors
$ echo "Jane" | jq -Rc '{(.): 42}'
{"Jane":42}
Az objektumépítés néhány gyakori esetére van rövidített szintaxis.
Kulcs-érték párok újrafelhasználása egy bemeneti objektumból.
$ jq -n '$ENV | {USER: .USER, EDITOR: .EDITOR}'
{
"USER": "glennj",
"EDITOR": "vim"
}
$ENV egy objektum, amely a környezet név-érték párjait tartalmazza.
Az ismétlődő key: .key párok helyett elég csak key-t írni.
$ jq -n '$ENV | {USER, EDITOR}'
{
"USER": "glennj",
"EDITOR": "vim"
}
Hasonlóképpen van rövidítés a változók használatakor is.
$ jq -cn '"foo" as $a | "bar" as $b | {a: $a, b: $b}'
{"a":"foo","b":"bar"}
$ jq -cn '"foo" as $a | "bar" as $b | {$a, $b}'
{"a":"foo","b":"bar"}
Az értékeket pontjelöléssel kérheted le egy objektumból.
{name: "Jane", age: 42} | .age # => 42
Ha a kulcsra nem tudsz azonosítóként hivatkozni, használj szögletes zárójeles jelölést.
"name" as $key | {name: "Jane", age: 42} | .$key # => error
"name" as $key | {name: "Jane", age: 42} | .[$key] # => "Jane"
Ha a kulcs nincs benne az objektumban, az eredmény null.
{name: "Jane", age: 42} | .sport # => null
Rá fogsz jönni, hogy ezt a műveletet újra és újra el kell végezned, amikor API-lekérdezések eredményeit dolgozod fel.
Ha adott egy tömböt vagy objektumértéket tartalmazó objektum, az indexkifejezéseket „láncolhatjuk” egymáshoz.
{
"name": "Jane",
"age": 42,
"pets": ["cat", "fish"],
"address": {"street": "123 Main St", "city": "Springfield"}
}
| (
.pets[1], # => "fish"
.address.city # => "Springfield"
)
Ha új kulcs-érték párt szeretnél hozzáadni egy tömbhöz, vagy frissíteni szeretnéd egy meglévő kulcs értékét, használd a = értékadó operátort úgy, hogy a bal oldalon egy indexkifejezés szerepel.
{name: "Jane", age: 42} | .sport = "tennis" | .age = 21
# => {
# "name": "Jane",
# "age": 21,
# "sport": "tennis"
# }
A + operátor összefésüli az objektumokat.
{Richard: 54} + {Jane: 42}
# => {
# "Richard": 54,
# "Jane": 42
# }
Egy kulcs eltávolításához használd a del függvényt.
Visszaadja a frissített objektumot.
{name: "Jane", age: 42} | del(.age) # => {"name": "Jane"}
A del paramétere egy indexkifejezés (pont- vagy szögletes zárójeles jelöléssel), amely az objektum egy kulcsára mutat.
A jq útvonalkifejezésnek nevezi.
Nem elég egyszerűen egy stringet megadni.
{name: "Jane", age: 42} | del(name) # error: name/0 is not defined
{name: "Jane", age: 42} | del("name") # error: Invalid path expression with result "name"
{name: "Jane", age: 42} | del(.name) # OK
{name: "Jane", age: 42} | del(.["name"]) # OK
Annak vizsgálatához, hogy az objektumnak van-e kulcsa, használd a has függvényt.
{name: "Jane", age: 42} as $example
|
($example | has("name")), # => true
($example | has("sport")) # => false
Az in operátorral tesztelheted, hogy egy kulcs benne van-e egy objektumban.
{name: "Jane", age: 42} as $example
|
("name" | in($example)), # => true
("sport" | in($example)) # => false
Az összes kulcs listázásához használd a keys függvényt.
{name: "Jane", age: 42} | keys # => ["age", "name"]
Vedd figyelembe, hogy a keys rendezi a kulcsokat.
Ha az eredeti sorrendben szeretnéd lekérni a kulcsokat, használd a keys_unsorted függvényt.
Nincs megfelelő függvény az összes érték listázására.
A .[] szűrő azonban az objektum értékeit folyamként adja ki, és ez a folyam a [...] tömbkonstruktorral befogható.
[{first: "Jane", last: "Lopez", status: "awesome!"} | .[]]
# => ["Jane", "Lopez", "awesome!"]
A map_values(filter) függvény a szűrőt az objektum minden értékére alkalmazza.
{first: "Jane", last: "Lopez", status: "awesome!"}
| map_values(ascii_upcase)
# => {"first": "JANE", "last": "LOPEZ", "status": "AWESOME!"}
Egy objektum bejárásához először kulcs-érték objektumok tömbjévé kell alakítanunk.
A to_entries függvény ezt teszi.
{name: "Jane", age: 42} | to_entries
# => [
# {
# "key": "name",
# "value": "Jane"
# },
# {
# "key": "age",
# "value": 42
# }
# ]
Ezen a ponton használhatunk tömbiterációs függvényeket, például a map függvényt.
A from_entries függvény ennek fordítottja: kulcs-érték objektumok tömbjét objektummá alakítja.
[
{"key":"name", "value":"Jane"},
{"key":"age", "value":42}
] | from_entries # => {"name": "Jane", "age": 42}
Ha egy objektum minden kulcs-érték párjára alkalmazni szeretnél egy szűrőt, használd a with_entries(filter) függvényt.
Például ha adott egy objektum, amely nevet rendel egy életkorhoz, a kulcsok és értékek a következőképpen cserélhetők fel.
{"Jane": 42, "Richard": 54}
| with_entries({key: (.value | tostring), value: .key})
kimenete:
{
"42": "Jane",
"54": "Richard"
}
A with_entries(filter) ugyanaz, mint
to_entries | map(filter) | from_entries