Kurzusok
/
jq
jq
/
Tanterv
/
Objektumok
Ob

Objektumok ebben a kurzusban: jq

4 feladat

A(z) Objektumok fogalomról

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ő.

Objektumok létrehozása

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}

Rövidített jelölések

Az objektumépítés néhány gyakori esetére van rövidített szintaxis.

  1. 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"
    }
    
  2. 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"}
    

Indexelés

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

Egymásba ágyazott értékek indexelése

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"
)

Kulcs-érték párok hozzáadása vagy módosítása

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
#    }

Kulcs eltávolítása

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

Kulcs létezésének vizsgálata

  • 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
    

Kulcsok vagy értékek listázása

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!"]

Iterálás

  • 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
    
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Objektumok fogalmat

A gyakorlás zárolva

Oldj fel még 4 feladatot, hogy gyakorolhasd a(z) Objektumok fogalmat