DevOps-bootcamp · Oppitunti

JSON-objektien muuntaminen ja rakentaminen jq:lla

Muotoile data uudelleen map-, to_entries- ja objektien rakennustoiminnoilla uusien JSON-hyötykuormien tuottamiseksi.

Oppitunti 2/413 vaihetta

JSON-objektien muuntaminen ja rakentaminen jq:lla on ilmainen DevOps-bootcamp-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu DevOps-bootcamp-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. DevOps-bootcamp-kurssilla on yhteensä 4 oppituntia.

Miksi JSON-dataa muunnetaan

Sovellusliittymistä tai lokitiedostoista saatava raaka JSON-data on harvoin täsmälleen tarvitsemassanne muodossa. Saatatte saada suuren objektin, josta haluatte vain tietyt kentät, tai teidän on ehkä nimettävä avaimia uudelleen, litistettävä sisäkkäisiä rakenteita tai muodostettava kokonaan uusi hyötykuorma lähetettäväksi toiseen palveluun.

jq on kevyt ja tehokas komentorivin JSON-prosessori, joka mahdollistaa tällaiset muunnokset yhdessä putkessa. Tässä oppitunnissa opitte kolme keskeistä tekniikkaa datan rakenteen muokkaamiseen:

  • Objektin muodostaminen — muodostetaan uusi JSON-objekti alusta alkaen
  • map — sovelletaan muunnosta taulukon jokaiseen alkioon
  • to_entries / from_entries — käsitellään objektin avain-arvo-parit taulukkona, jotta niitä voidaan suodattaa ja muodostaa uudelleen

Kaikissa esimerkeissä oletetaan, että jq on asennettu (apt install jq / brew install jq).

Objektien muodostamisen perusteet

jq:n perustavanlaatuisin ominaisuus on objektin muodostaminen: lausekkeet ympäröidään merkeillä {} uuden JSON-objektin muodostamiseksi. Voitte valita sisällytettävät kentät ja antaa niille haluamanne nimet.

Syntaksi:

  • { newKey: .existingField } — nimeää kentän uudelleen
  • { name, age } — lyhyt muoto, kun uusi avain vastaa kentän nimeä
  • { total: (.price * .qty) } — laskee arvon suoraan lausekkeessa

Alla oleva katkelma lukee tuotteen JSON-tiedot ja tuottaa tiiviimmän rakenteen, joka sisältää lasketun subtotal-kentän.

#!/usr/bin/env bash
# Object construction: pick and rename fields
product='{
  "id": 42,
  "name": "Widget Pro",
  "price": 9.99,
  "qty": 3,
  "warehouse": "EU-West"
}'

echo "$product" | jq '{
  productId: .id,
  name,
  subtotal: (.price * .qty)
}'

Objektien muodostaminen sisäkkäisestä datasta

Tuotantokäytössä oleva JSON-data on usein sisäkkäistä. jq:n avulla voitte käsitellä sisäkkäisiä polkuja objektin muodostajan sisällä ja samalla litistää rakenteen.

Käyttäkää pistepolkumerkintää muodostajan arvolausekkeessa:

  • { city: .address.city }
  • { lat: .location.coords.lat }

Alla oleva esimerkki ottaa syvästi sisäkkäisen käyttäjätietueen ja tuottaa siitä litteän yhteenvedon, joka sopii CSV-otsikkoriville tai API-pyynnön rungoksi.

#!/usr/bin/env bash
user='{
  "id": "u-001",
  "profile": {
    "displayName": "Ada Lovelace",
    "contact": { "email": "ada@example.com", "phone": "+44-700" }
  },
  "plan": "pro"
}'

echo "$user" | jq '{
  id,
  name: .profile.displayName,
  email: .profile.contact.email,
  plan
}'

Taulukoiden muuntaminen map-funktiolla

map(expr) vastaa jq:ssä for-each-rakennetta: se soveltaa expr-lauseketta syötetaulukon jokaiseen alkioon ja palauttaa uuden, yhtä pitkän taulukon.

Keskeiset asiat:

  • map(expr) on lyhyt muoto ilmaisulle [.[] | expr]
  • Sisäinen lauseke voi olla mikä tahansa jq-suodatin — myös objektin muodostaminen
  • Yhdistäkää se select()-suodattimeen ennen muuntamista

Katkelma käsittelee tilausten luetteloa ja säilyttää vain toimitusluetteloon tarvittavat kentät.

#!/usr/bin/env bash
orders='[
  {"orderId": 1, "customer": "Alice", "total": 42.50, "status": "shipped"},
  {"orderId": 2, "customer": "Bob",   "total": 18.00, "status": "pending"},
  {"orderId": 3, "customer": "Carol", "total": 99.99, "status": "shipped"}
]'

# Produce a shipping manifest: only shipped orders, slim fields
echo "$orders" | jq '[
  .[] | select(.status == "shipped") | {
    id: .orderId,
    recipient: .customer,
    amount: .total
  }
]'

map ja lasketut kentät

map-funktion sisällä voitte laskea uusia arvoja, muuntaa tyyppejä ja yhdistää kenttiä — ette ainoastaan kopioida niitä. Yleisiä malleja ovat:

  • Merkkijonojen interpolointi: "\(.first) \(.last)"
  • Aritmetiikka: (.price * 1.2 | round) 20 prosentin hinnankorotukseen
  • Ehdolliset lausekkeet: if .score >= 90 then "A" else "B" end

Alla oleva esimerkki täydentää työntekijäluetteloa lisäämällä lasketun fullName-kentän ja työkokemuksen vuosien perusteella määräytyvän seniority-tunnisteen.

#!/usr/bin/env bash
staff='[
  {"first": "Grace", "last": "Hopper",  "years": 15},
  {"first": "Alan",  "last": "Turing",  "years": 4},
  {"first": "Linus", "last": "Torvalds","years": 9}
]'

echo "$staff" | jq 'map({
  fullName: "\(.first) \(.last)",
  years,
  seniority: (if .years >= 10 then "senior" elif .years >= 5 then "mid" else "junior" end)
})'

to_entries-toiminnon ymmärtäminen

to_entries muuntaa JSON-objektin taulukoksi, joka sisältää {key, value}-pareja. Näin objektin kenttiin voidaan soveltaa taulukko-operaatioita, kuten map-, select- ja sort-toimintoja — suoraan objektille niitä ei voi tehdä.

Esimerkki muunnoksesta:

  • Syöte: {"a": 1, "b": 2}
  • Tuloste: [{"key": "a", "value": 1}, {"key": "b", "value": 2}]

Käänteinen toiminto on from_entries, joka muuntaa taulukon takaisin objektiksi. Yhdessä ne muodostavat to_entries | map(...) | from_entries -idiomin objektitason muunnoksiin.

#!/usr/bin/env bash
# Demonstrate to_entries and from_entries
config='{"host": "db.local", "port": 5432, "ssl": true}'

echo "--- to_entries output ---"
echo "$config" | jq 'to_entries'

echo "--- round-trip back to object ---"
echo "$config" | jq 'to_entries | from_entries'

Avainten suodattaminen to_entries-toiminnolla

Yksi to_entries-toiminnon käytännöllisimmistä käyttötavoista on säilytettävien tai poistettavien avainten dynaaminen suodattaminen itse avaimen nimen perusteella — objektin muodostamisella tätä ei voi tehdä, jos avainten nimiä ei tiedetä etukäteen.

Malli:

  • to_entries | map(select(.key | test("regex"))) | from_entries
  • to_entries | map(select(.key != "secret")) | from_entries

Alla oleva katkelma poistaa kaikki alaviivalla alkavat avaimet (sisäiset/yksityiset kentät) ennen määritysobjektin välittämistä ulkoiselle palvelulle.

#!/usr/bin/env bash
raw_config='{
  "endpoint": "https://api.example.com",
  "timeout": 30,
  "_internalToken": "s3cr3t",
  "_debugMode": true,
  "retries": 3
}'

# Remove any key starting with underscore
echo "$raw_config" | jq '
  to_entries
  | map(select(.key | startswith("_") | not))
  | from_entries
'

Avainten dynaaminen uudelleennimeäminen to_entries-toiminnolla

Objektin muodostamisella avaimet voidaan nimetä uudelleen, kun niiden nimet tiedetään kirjoitushetkellä. to_entries mahdollistaa avainten nimeämisen uudelleen ohjelmallisesti — esimerkiksi camelCase-muodon muuntamisen snake_case-muotoon tai etuliitteen lisäämisen.

map-funktion sisällä päivitätte kunkin tietueen .key-kentän ja välitätte tuloksen sitten from_entries-toiminnolle:

  • map(.key |= gsub("(?<=[a-z])(?=[A-Z])"; "_") | .key |= ascii_downcase) — camelCase-muodosta snake_case-muotoon
  • map(.key |= "app_" + .) — lisää etuliitteen jokaiseen avaimeen

Esimerkki lisää kaikkiin ympäristömuuttujien nimiin etuliitteen APP_, jotta ne saadaan omaan nimiavaruuteensa ennen niiden välittämistä säilöön.

#!/usr/bin/env bash
env_vars='{"host": "localhost", "port": "8080", "debug": "false"}'

# Add APP_ prefix and uppercase all keys
echo "$env_vars" | jq '
  to_entries
  | map({ key: ("APP_" + (.key | ascii_upcase)), value })
  | from_entries
'

with_entries: kätevä lyhyt muoto

Malli to_entries | map(...) | from_entries on niin yleinen, että jq tarjoaa sille lyhyen muodon: with_entries(expr).

Se vastaa täsmälleen samaa toimintoa, mutta on tiiviimpi:

  • with_entries(.value |= . * 2) — kaksinkertaistaa jokaisen numeerisen arvon
  • with_entries(select(.value != null)) — poistaa avaimet, joiden arvo on null
  • with_entries(.key |= ascii_upcase) — muuttaa kaikki avaimet suuraakkosiksi

Katkelma poistaa kaikki avaimet, joiden arvo on null tai tyhjä merkkijono — tämä on yleinen siivousvaihe ennen PATCH-pyynnön lähettämistä REST-sovellusliittymään.

#!/usr/bin/env bash
patch_body='{
  "name": "Mehmet",
  "email": "",
  "phone": null,
  "city": "Istanbul"
}'

# Drop empty/null fields before PATCH
cleaned=$(echo "$patch_body" | jq '
  with_entries(select(.value != null and .value != ""))
')

echo "Cleaned payload:"
echo "$cleaned"

# In practice you would pipe to curl:
# curl -s -X PATCH https://api.example.com/users/1 \
#   -H "Content-Type: application/json" \
#   -d "$cleaned"

map- ja objektinmuodostuksen yhdistäminen putkessa

Reaalimaailman muunnoksissa useita jq-toimintoja ketjutetaan yhteen. Tyypillinen API-hyötykuorman valmisteluun käytettävä putki voi:

  1. Suodattaa syötetaulukon komennolla map(select(...))
  2. Muotoilla jokaisen alkion uudelleen objektin muodostuksella
  3. Lisätä laskettuja kenttiä
  4. Järjestää tuloksen

Alla oleva esimerkki lukee palvelinmittareiden luettelon, säilyttää vain paljon suoritinta käyttävät palvelimet ja tuottaa webhookiin POST-pyynnöllä lähetettävän tiiviin hälytyshyötykuorman.

#!/usr/bin/env bash
metrics='[
  {"host": "web-01", "cpu": 23, "mem": 60, "region": "eu"},
  {"host": "web-02", "cpu": 91, "mem": 88, "region": "eu"},
  {"host": "db-01",  "cpu": 78, "mem": 95, "region": "us"},
  {"host": "db-02",  "cpu": 12, "mem": 40, "region": "us"}
]'

alerts=$(echo "$metrics" | jq '[
  .[] | select(.cpu > 75 or .mem > 85) | {
    server: .host,
    region,
    severity: (if .cpu > 90 or .mem > 90 then "critical" else "warning" end),
    metrics: { cpu: .cpu, mem: .mem }
  }
] | sort_by(.severity)')

echo "$alerts"

Uuden JSON-objektin muodostaminen useista lähteistä

jq voi yhdistää syötteitä ja muodostaa useista JSON-lähteistä tietoja kokoavia objekteja yhteenlaskuoperaattorin + ja as $var-muuttujasidonnan avulla.

Hyödyllisiä malleja:

  • obj1 + obj2 — yhdistää kaksi objektia (oikeanpuoleinen voittaa avainristiriidoissa)
  • --argjson — välittää toisen JSON-asiakirjan muuttujana
  • $ENV — lukee ympäristömuuttujat suoraan jq:n sisällä

Katkelma yhdistää perusmäärityksen ympäristökohtaisiin ohituksiin — tämä on yleinen malli 12-factor-sovellusten määritysten hallinnassa komentotulkkiskripteissä.

#!/usr/bin/env bash
base_config='{
  "logLevel": "info",
  "timeout": 30,
  "retries": 3,
  "database": "postgres://db.local/app"
}'

env_overrides='{
  "logLevel": "debug",
  "database": "postgres://db.staging/app_staging"
}'

# Merge: overrides win on conflicts
merged=$(echo "$base_config" | jq --argjson overrides "$env_overrides" '. + $overrides')

echo "Merged config:"
echo "$merged"

Tietotarkistus: to_entries ja map

Teillä on seuraava JSON-objekti, ja teidän on poistettava kaikki avaimet, joiden arvo on pienempi kuin 0, jolloin tuloksena on uusi objekti, joka sisältää vain epänegatiiviset arvot. Mikä jq-lauseke tekee tämän oikein?

Syöte: {"a": 10, "b": -3, "c": 0, "d": 5}

Oppitunnin kertaus: JSON-datan muuntaminen jq:llä

Olette käsitelleet JSON-datan rakenteen muokkaamisen keskeiset tekniikat jq:llä:

  • Objektin muodostaminen {} — muodostetaan uusia objekteja valitsemalla, nimeämällä uudelleen ja laskemalla kenttiä syötteestä
  • map(expr) — sovelletaan mitä tahansa muunnosta taulukon jokaiseen alkioon, mukaan lukien sisäkkäinen objektin muodostaminen ja suodattamiseen käytettävä select()
  • to_entries / from_entries — muunnetaan objekti {key, value}-parien taulukoksi, jolloin avaimille ja arvoille voidaan tehdä taulukko-operaatioita, ja muunnetaan se sitten takaisin
  • with_entries(expr) — tiivis lyhyt muoto täydelle to_entries → map → from_entries -putkelle
  • Objektien yhdistäminen komennolla + ja valitsimella --argjson useista lähteistä muodostettavia hyötykuormia varten

Nämä rakennuspalikat toimivat yhdessä: suodattakaa select-toiminnolla, muokatkaa rakennetta objektin muodostamisella, täydentäkää lasketuilla kentillä ja ketjuttakaa kaikki yhdeksi helposti luettavaksi jq-lausekkeeksi. Näiden mallien hallitseminen tarkoittaa, että voitte käsitellä käytännössä mitä tahansa JSON-hyötykuormaa suoraan komentotulkissa ilman erillisen Python- tai Node-komentosarjan kirjoittamista.

Aloita maksutta

Opi DevOps-bootcamp tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
142
Oppitunnit
568

Usein kysytyt kysymykset

Onko oppitunti ”JSON-objektien muuntaminen ja rakentaminen jq:lla” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa DevOps-bootcamp-oppimispolun 3 oppituntia, myös oppitunnin “JSON-objektien muuntaminen ja rakentaminen jq:lla”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. DevOps-bootcamp-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”JSON-objektien muuntaminen ja rakentaminen jq:lla”?

Muotoile data uudelleen map-, to_entries- ja objektien rakennustoiminnoilla uusien JSON-hyötykuormien tuottamiseksi. Harjoittelet DevOps-bootcamp-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni DevOps-bootcamp-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin DevOps-bootcamp-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”JSON-objektien muuntaminen ja rakentaminen jq:lla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä DevOps-bootcamp-oppitunnilla?

Kyllä. Jokainen DevOps-bootcamp-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. JSON-datan suodattaminen ja valitseminen jq-putkilla
  2. JSON-objektien muuntaminen ja rakentaminen jq:lla
  3. REST-rajapintojen käyttäminen curlilla ja jq:lla
  4. YAML-määritystiedostojen muokkaaminen yq:lla
← Takaisin: DevOps-bootcamp