A JSON-objektum (hogy más nyelvek terminológiáját használjuk) lényegében egy „hash”, „map” vagy „szótár”.
A JSON így definiálja az objektumot:
Az objektum név/érték párok rendezetlen halmaza. Az objektum
{nyitó kapcsos zárójellel kezdődik és}záró 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 csak string lehet. A név másik elnevezése a kulcs.
Az érték bármilyen JSON-típusú lehet. Egy objektumon belül a különböző értékek eltérő 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 összegyűjtéséhez kapcsos zárójelet használj. Bár a neveknek stringnek kell lenniük, nem kell őket idézőjelbe tenni, ha azonosítószerű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ószerűek. Csak tedd őket idézőjelbe.
{"first name": "Jane", "last name": "Lopez", age: 42}
Ha a név egy kifejezés eredménye, akkor a kifejezést zárójelbe kell tenni.
$ echo "Jane" | jq -Rc '{.: 42}'
# verbose error message ...
$ echo "Jane" | jq -Rc '{(.): 42}'
{"Jane":42}
Az értékeket pontjelöléssel lehet kiolvasni 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 új kulcs-érték párt szeretnél hozzáadni egy objektumhoz, 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 áll.
{name: "Jane", age: 42} | .sport = "tennis" | .age = 21
# => {
# "name": "Jane",
# "age": 21,
# "sport": "tennis"
# }
A + operátor összevonja az objektumokat.
{Richard: 54} + {Jane: 42}
# => {
# "Richard": 54,
# "Jane": 42
# }
Egy kulcs eltávolításához használd a del függvényt.
Az 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 oldódik fel.
A jq ezt útvonalkifejezésnek nevezi.
Nem elég pusztán 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 ellenőrzésére, hogy az objektum rendelkezik-e egy kulccsal, használd a has függvényt.
{name: "Jane", age: 42} as $example
|
($example | has("name")), # => true
($example | has("sport")) # => false
Azt, hogy egy kulcs szerepel-e egy objektumban, az in operátorral ellenőrizheted.
{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"]
Vegyük észre, hogy a keys rendezi a kulcsokat.
Ha az eredeti sorrendben szeretnéd megkapni a kulcsokat, használd a keys_unsorted függvényt.
Nincs arra megfelelő függvény, hogy az összes értéket listázd.
A .[] szűrő azonban folyamként adja ki az objektum értékeit, és ez a folyam a [...] tömbkonstruktorral fogható meg.
[{first: "Jane", last: "Lopez", status: "awesome!"} | .[]]
# => ["Jane", "Lopez", "awesome!"]
A map_values(filter) függvény a szűrőt az objektum minden egyes értékére alkalmazza.
{first: "Jane", last: "Lopez", status: "awesome!"}
| map_values(ascii_upcase)
# => {"first": "JANE", "last": "LOPEZ", "status": "AWESOME!"}
Ahhoz, hogy egy objektumon iteráljunk, először kulcs-érték objektumok tömbjévé kell alakítanunk.
Ezt a to_entries függvény végzi el.
{name: "Jane", age: 42} | to_entries'
# => [
# {
# "key": "name",
# "value": "Jane"
# },
# {
# "key": "age",
# "value": 42
# }
# ]
Ezen a ponton már használhatjuk a tömbiterációs függvényeket, például a map-et.
A from_entries függvény ennek a fordítottja: kulcs-érték objektumok tömbjét alakítja objektummá.
[
{"key":"name", "value":"Jane"},
{"key":"age", "value":42}
] | from_entries # =>{"name": "Jane", "age": 42}
Ha egy szűrőt az objektum minden kulcs-érték párjára alkalmazni szeretnél, használd a with_entries(filter) függvényt.
Például ha adott egy objektum, amely nevet képez le életkorra, a kulcsok és az értékek a következőképpen cserélhetők fel.
{"Jane": 42, "Richard": 54}
| with_entries({key: (.value | tostring), value: .key})
az alábbi kimenetet eredményezi:
{
"42": "Jane",
"54": "Richard"
}
A with_entries(filter) ugyanaz, mint
to_entries | map(filter) | from_entries
Ebben a feladatban egy módot valósítasz meg arra, hogy nyomon kövesd a helyi játéktermed legnépszerűbb játékának csúcspontszámait.
Hat függvényt kell megvalósítanod, amelyek többnyire egy csúcspontszámokat tároló objektum kezeléséhez kapcsolódnak.
Írj egy create_score_board függvényt, amely létrehoz egy objektumot, ami csúcspontszám-táblaként szolgál.
Az objektum kulcsai a játékosok nevei lesznek, az értékek pedig a pontszámaik.
A tesztelés miatt eleve szeretnél egy bejegyzést is szerepeltetni az objektumban.
Ez a kezdeti bejegyzés "The Best Ever" játékosnévből és 1000000 pontszámból álljon.
create_score_board
# returns an object with one initial entry
Ha játékost szeretnél hozzáadni a csúcspontszám-táblához, valósítsd meg az add_player függvényt.
Bemenetként egy csúcspontszám-táblát kap, és két paraméterre van szüksége: a játékos nevére és a játékos pontszámára.
A függvény az új játékossal kiegészített csúcspontszám-tábla objektumot adja vissza.
{"José Valim", 486373}
| add_player("Dave Thomas"; 0)
# => {"Dave Thomas": 0, "José Valim": 486373} -- in some order
Ha a játékos már szerepel a táblán, a táblát változatlanul add vissza.
Ha a játékosok megszegik a játékterem szabályait, kézzel távolítják el őket a csúcspontszám-tábláról.
Valósítsd meg a remove_player függvényt, amely bemenetként egy táblát és egy paramétert kap: az eltávolítandó játékos nevét.
A függvény eltávolítja az adott játékos bejegyzését a tábláról, és az új táblát adja vissza.
Ha a játékos eleve nem szerepelt a táblán, a táblával nem történik semmi; változatlanul kell visszaadni.
{"Dave Thomas": 0} | remove_player("Dave Thomas")
# => {}
{"Dave Thomas": 0} | remove_player("Rose Fanaras")
# => {"Dave Thomas": 0}
Ha egy játékos újabb játékot fejez be a játékteremben, bizonyos mennyiségű pont hozzáadódik a táblán szereplő korábbi pontszámához.
Valósítsd meg az update_score függvényt, amely bemenetként egy csúcspontszám-táblát kap, és két paraméterre van szüksége: a játékos nevére és a hozzáadandó pontszámra.
A függvény a frissítés elvégzése utáni csúcspontszám-táblát adja vissza.
{"Freyja Ćirić": 12771000} | update_score("Freyja Ćirić"; 73)
# => {"Freyja Ćirić": 12771073}
Ha a játékos még nem szerepelt a táblán, e függvény adja hozzá.
A játékterem hétfőnként külön csúcspontszám-táblát vezet. A nap végén a táblán szereplő minden játékos 100 további pontot kap.
Valósítsd meg az apply_monday_bonus függvényt.
A függvény minden, a táblán szereplő játékoshoz hozzáadja a bónuszpontokat.
{
"Dave Thomas": 44,
"Freyja Ćirić": 539,
"José Valim": 265
}
| apply_monday_bonus
# => {"Dave Thomas": 144, "Freyja Ćirić": 639, "José Valim": 365}
A különböző játéktermek versengenek egymással, hogy eldőljön, kinek vannak a legjobb játékosai. A legnagyobb összpontszámot elérő játékterem nyeri el a megtiszteltetést.
Írj egy total_score függvényt.
Bemenetként egy csúcspontszám-táblát kap, és az összes játékos pontszámának összegét adja vissza.
{
"Dave Thomas": 44,
"Freyja Ćirić": 539,
"José Valim": 265
}
| total_score
# => 848
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) jq nyelvet 12 fogalom75 feladat segítségével, valódi emberi mentorálással, mindez ingyen.