0Pricing
Linux Command Line & Bash Scripting Mastery · Lektion

JSON-Objekte mit jq umformen und erstellen

Formen Sie Daten mit map, to_entries und der Objekterstellung um, um neue JSON-Nutzdaten zu erzeugen.

JSON-Objekte mit jq umformen und erstellen ist eine kostenlose Linux Command Line & Bash Scripting Mastery-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Linux Command Line & Bash Scripting Mastery-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Linux Command Line & Bash Scripting Mastery-Kurs umfasst insgesamt 4 Lektionen.

Warum JSON transformieren?

Rohes JSON aus APIs oder Protokolldateien hat nur selten genau die Struktur, die Sie benötigen. Möglicherweise erhalten Sie ein großes Objekt, möchten aber nur bestimmte Felder verwenden, Schlüssel umbenennen, verschachtelte Strukturen abflachen oder eine vollständig neue Nutzlast für einen anderen Dienst erstellen.

jq ist ein schlanker, leistungsfähiger JSON-Prozessor für die Kommandozeile, mit dem solche Transformationen in einer einzigen Pipeline möglich werden. In dieser Lektion lernen Sie die drei grundlegenden Techniken zum Umformen von Daten kennen:

  • Objekterstellung – ein neues JSON-Objekt von Grund auf erstellen
  • map – eine Transformation auf jedes Element eines Arrays anwenden
  • to_entries / from_entries – die Schlüssel-Wert-Paare eines Objekts als Array behandeln, um sie zu filtern und neu zusammenzusetzen

Bei allen Beispielen wird vorausgesetzt, dass jq installiert ist (apt install jq / brew install jq).

Grundlagen der Objekterstellung

Die grundlegendste jq-Funktion ist die Objekterstellung: Sie schließen Ausdrücke in {} ein, um ein neues JSON-Objekt zu erstellen. Dabei wählen Sie aus, welche Felder enthalten sein sollen und wie sie heißen.

Syntax:

  • { newKey: .existingField } – ein Feld umbenennen
  • { name, age } – Kurzschreibweise, wenn der neue Schlüssel dem Feldnamen entspricht
  • { total: (.price * .qty) } – einen Wert direkt im Ausdruck berechnen

Das folgende Snippet liest ein Produkt-JSON ein und erzeugt daraus eine kompaktere Struktur mit dem berechneten Feld subtotal.

#!/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)
}'

Objekte aus verschachtelten Daten erstellen

JSON aus der Praxis ist häufig verschachtelt. Mit jq können Sie in einem Objektkonstruktor auf verschachtelte Pfade zugreifen und dabei die Struktur gleichzeitig abflachen.

Verwenden Sie die Punktpfadnotation innerhalb des Wertausdrucks des Konstruktors:

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

Das folgende Beispiel nimmt einen tief verschachtelten Benutzerdatensatz und erstellt daraus eine flache Zusammenfassung, die sich für eine CSV-Kopfzeile oder den Body einer API-Anfrage eignet.

#!/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
}'

Arrays mit map transformieren

map(expr) entspricht in jq einer for-each-Schleife: Der Ausdruck expr wird auf jedes Element eines Eingabearrays angewendet, und es wird ein neues Array gleicher Länge zurückgegeben.

Wichtige Punkte:

  • map(expr) ist eine Kurzschreibweise für [.[] | expr]
  • Der enthaltene Ausdruck kann jeder jq-Filter sein – einschließlich der Objekterstellung
  • Verketten Sie map() mit select(), um vor der Transformation zu filtern

Das Snippet verarbeitet eine Liste von Bestellungen und behält nur die für einen Versandbegleitschein benötigten Felder bei.

#!/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 mit berechneten Feldern

Innerhalb von map können Sie neue Werte berechnen, Typen konvertieren und Felder kombinieren – sie also nicht nur kopieren. Häufige Muster sind:

  • String-Interpolation: "\(.first) \(.last)"
  • Arithmetik: (.price * 1.2 | round) für einen Aufschlag von 20 %
  • Bedingungen: if .score >= 90 then "A" else "B" end

Das folgende Beispiel erweitert eine Liste von Mitarbeitenden um den berechneten vollständigen Namen fullName und eine Bezeichnung für die Betriebszugehörigkeit seniority, die auf den Jahren an Berufserfahrung basiert.

#!/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 verstehen

to_entries wandelt ein JSON-Objekt in ein Array aus {key, value}-Paaren um. Dadurch können Sie Array-Operationen (map, select, sort) auf die Felder eines Objekts anwenden – etwas, das direkt auf einem Objekt nicht möglich ist.

Beispieltransformation:

  • Eingabe: {"a": 1, "b": 2}
  • Ausgabe: [{"key": "a", "value": 1}, {"key": "b", "value": 2}]

Die umgekehrte Operation ist from_entries; sie wandelt das Array wieder in ein Objekt um. Zusammen bilden sie das Idiom to_entries | map(...) | from_entries für Transformationen auf Objektebene.

#!/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'

Schlüssel mit to_entries filtern

Eine der praktischsten Anwendungen von to_entries ist das dynamische Filtern der beizubehaltenden oder zu entfernenden Schlüssel anhand des Schlüsselnamens selbst – etwas, das mit der Objekterstellung nicht möglich ist, wenn die Schlüsselnamen im Voraus nicht bekannt sind.

Muster:

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

Das folgende Snippet entfernt alle Schlüssel, die mit einem Unterstrich beginnen (interne/private Felder), bevor ein Konfigurationsobjekt an einen externen Dienst weitergeleitet wird.

#!/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
'

Schlüssel mit to_entries dynamisch umbenennen

Mit der Objekterstellung können Sie Schlüssel umbenennen, wenn ihre Namen beim Schreiben bekannt sind. to_entries ermöglicht es Ihnen, Schlüssel programmatisch umzubenennen – beispielsweise camelCase in snake_case umzuwandeln oder ein Präfix hinzuzufügen.

Innerhalb von map aktualisieren Sie das Feld .key jedes Eintrags und leiten anschließend an from_entries weiter:

  • map(.key |= gsub("(?<=[a-z])(?=[A-Z])"; "_") | .key |= ascii_downcase) – camelCase in snake_case umwandeln
  • map(.key |= "app_" + .) – jedem Schlüssel ein Präfix hinzufügen

Das Beispiel versieht alle Namen von Umgebungsvariablen mit dem Präfix APP_, um sie vor der Injektion in einen Container zu namespacen.

#!/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: die praktische Kurzschreibweise

Das Muster to_entries | map(...) | from_entries kommt so häufig vor, dass jq dafür eine Kurzschreibweise bereitstellt: with_entries(expr).

Sie ist genau gleichwertig, aber kürzer:

  • with_entries(.value |= . * 2) – jeden numerischen Wert verdoppeln
  • with_entries(select(.value != null)) – Schlüssel mit dem Wert null entfernen
  • with_entries(.key |= ascii_upcase) – alle Schlüssel in Großbuchstaben umwandeln

Das Snippet entfernt alle Schlüssel, deren Wert null oder eine leere Zeichenkette ist – ein üblicher Bereinigungsschritt vor dem Senden einer PATCH-Anfrage an eine REST-API.

#!/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 und Objekterstellung in einer Pipeline kombinieren

Transformationen aus der Praxis verketten mehrere jq-Operationen. Eine typische Pipeline zur Vorbereitung einer API-Nutzlast könnte:

  1. das Eingabearray mit map(select(...)) filtern
  2. jedes Element mit der Objekterstellung umformen
  3. berechnete Felder hinzufügen
  4. das Ergebnis sortieren

Das folgende Beispiel liest eine Liste von Servermetriken ein, behält nur Server mit hoher CPU-Auslastung bei und erstellt eine kompakte Alarmnutzlast, die direkt per POST an einen Webhook gesendet werden kann.

#!/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"

Ein neues JSON-Objekt aus mehreren Quellen erstellen

Mit jq können Sie Eingaben zusammenführen und Objekte erstellen, die mithilfe des Additionsoperators + und der Variablenbindung mit as $var Daten aus mehreren JSON-Quellen beziehen.

Nützliche Muster:

  • obj1 + obj2 – zwei Objekte zusammenführen (bei Konflikten hat die rechte Seite Vorrang)
  • --argjson – ein zweites JSON-Dokument als Variable übergeben
  • $ENV – Umgebungsvariablen direkt innerhalb von jq lesen

Das Snippet führt eine Basiskonfiguration mit umgebungsspezifischen Überschreibungen zusammen – ein gängiges Muster für die Verwaltung von Konfigurationen nach dem 12-Factor-Prinzip in Shell-Skripten.

#!/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"

Wissenscheck: to_entries vs. map

Sie haben das folgende JSON-Objekt und müssen alle Schlüssel entfernen, deren Wert kleiner als 0 ist, sodass ein neues Objekt mit ausschließlich nicht negativen Werten entsteht. Welcher jq-Ausdruck erfüllt diese Aufgabe korrekt?

Eingabe: {"a": 10, "b": -3, "c": 0, "d": 5}

Lektionszusammenfassung: JSON mit jq transformieren

Sie haben die wichtigsten Techniken zum Umformen von JSON mit jq behandelt:

  • Objekterstellung {} – neue Objekte erstellen, indem Sie Felder aus einer Eingabe auswählen, umbenennen und berechnen
  • map(expr) – eine beliebige Transformation auf jedes Element eines Arrays anwenden, einschließlich der Erstellung verschachtelter Objekte und select() zum Filtern
  • to_entries / from_entries – ein Objekt in ein Array aus {key, value}-Paaren umwandeln, um Operationen auf Schlüsseln und Werten zu ermöglichen, und anschließend zurückwandeln
  • with_entries(expr) – die kompakte Kurzschreibweise für die vollständige Pipeline to_entries → map → from_entries
  • Objekte zusammenführen mit + und --argjson für Nutzlasten aus mehreren Quellen

Diese Bausteine lassen sich kombinieren: mit select filtern, mit der Objekterstellung umformen, mit berechneten Feldern erweitern und alles in einem einzigen gut lesbaren jq-Ausdruck verketten. Wenn Sie diese Muster beherrschen, können Sie praktisch jede JSON-Nutzlast direkt in der Shell verarbeiten, ohne ein eigenes Skript in Python oder Node schreiben zu müssen.

Häufig gestellte Fragen

Ist die Lektion „JSON-Objekte mit jq umformen und erstellen“ kostenlos?

Ja — der vollständige Text von „JSON-Objekte mit jq umformen und erstellen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Linux Command Line & Bash Scripting Mastery-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Linux Command Line & Bash Scripting Mastery-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „JSON-Objekte mit jq umformen und erstellen“?

Formen Sie Daten mit map, to_entries und der Objekterstellung um, um neue JSON-Nutzdaten zu erzeugen. Du übst Linux Command Line & Bash Scripting Mastery mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Linux Command Line & Bash Scripting Mastery zu starten?

Keine Vorkenntnisse erforderlich. Linux Command Line & Bash Scripting Mastery auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „JSON-Objekte mit jq umformen und erstellen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Linux Command Line & Bash Scripting Mastery-Lektion Code schreiben und ausführen?

Ja. Jede Linux Command Line & Bash Scripting Mastery-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. JSON mit jq-Pipelines filtern und auswählen
  2. JSON-Objekte mit jq umformen und erstellen
  3. REST-APIs gemeinsam mit curl und jq nutzen
  4. YAML-Konfigurationsdateien mit yq bearbeiten
← Zurück zu Linux Command Line & Bash Scripting Mastery