JSON-objektien muuntaminen ja rakentaminen jq:lla
Muotoile data uudelleen map-, to_entries- ja objektien rakennustoiminnoilla uusien JSON-hyötykuormien tuottamiseksi.
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_entriesto_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-muotoonmap(.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 arvonwith_entries(select(.value != null))— poistaa avaimet, joiden arvo on nullwith_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:
- Suodattaa syötetaulukon komennolla
map(select(...)) - Muotoilla jokaisen alkion uudelleen objektin muodostuksella
- Lisätä laskettuja kenttiä
- 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 takaisinwith_entries(expr)— tiivis lyhyt muoto täydelle to_entries → map → from_entries -putkelle- Objektien yhdistäminen komennolla
+ja valitsimella--argjsonuseista 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.
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
- JSON-datan suodattaminen ja valitseminen jq-putkilla
- JSON-objektien muuntaminen ja rakentaminen jq:lla
- REST-rajapintojen käyttäminen curlilla ja jq:lla
- YAML-määritystiedostojen muokkaaminen yq:lla