Transformer et construire des objets JSON avec jq
Remodelez les données avec map, to_entries et la construction d’objets pour produire de nouvelles charges utiles JSON.
Transformer et construire des objets JSON avec jq est une leçon Linux Command Line & Bash Scripting Mastery gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Linux Command Line & Bash Scripting Mastery, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Linux Command Line & Bash Scripting Mastery comprend 4 leçons au total.
Pourquoi transformer du JSON ?
Le JSON brut provenant d’API ou de fichiers de journal a rarement exactement la structure dont vous avez besoin. Vous pouvez recevoir un objet volumineux alors que seuls certains champs vous intéressent, ou devoir renommer des clés, aplatir des structures imbriquées ou construire une nouvelle charge utile à envoyer à un autre service.
jq est un processeur JSON léger et puissant en ligne de commande qui permet d’effectuer ces transformations dans une seule chaîne de traitement. Dans cette leçon, vous apprendrez trois techniques fondamentales pour remodeler les données :
- Construction d’objet — créer un nouvel objet JSON à partir de zéro
- map — appliquer une transformation à chaque élément d’un tableau
- to_entries / from_entries — traiter les paires clé-valeur d’un objet comme un tableau afin de pouvoir les filtrer et les reconstruire
Tous les exemples supposent que jq est installé (apt install jq / brew install jq).
Principes de base de la construction d’objets
La fonctionnalité jq la plus fondamentale est la construction d’objets : entourer des expressions de {} pour créer un nouvel objet JSON. Vous choisissez les champs à inclure et le nom à leur donner.
Syntaxe :
{ newKey: .existingField }— renommer un champ{ name, age }— forme abrégée lorsque la nouvelle clé correspond au nom du champ{ total: (.price * .qty) }— calculer une valeur directement dans l’expression
L’extrait ci-dessous lit un produit JSON et produit une structure plus concise contenant un champ subtotal calculé.
#!/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)
}'Construire des objets à partir de données imbriquées
Le JSON réel est souvent imbriqué. jq vous permet d’accéder à des chemins imbriqués dans un constructeur d’objet, tout en aplatissant la structure.
Utilisez la notation par chemin avec des points dans l’expression de valeur du constructeur :
{ city: .address.city }{ lat: .location.coords.lat }
L’exemple ci-dessous prend un enregistrement utilisateur profondément imbriqué et produit un résumé à plat adapté à une ligne d’en-tête CSV ou au corps d’une requête d’API.
#!/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
}'Transformer des tableaux avec map
map(expr) est l’équivalent jq d’une boucle pour chaque élément : cette fonction applique expr à chaque élément d’un tableau d’entrée et renvoie un nouveau tableau de même longueur.
Points essentiels :
map(expr)est une forme abrégée de[.[] | expr]- L’expression interne peut être n’importe quel filtre jq, y compris une construction d’objet
- Combinez-la avec
select()pour filtrer avant de transformer
L’extrait traite une liste de commandes en ne conservant que les champs nécessaires à un bordereau d’expédition.
#!/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 avec des champs calculés
Dans map, vous pouvez calculer de nouvelles valeurs, convertir des types et combiner des champs, et pas seulement les copier. Voici quelques schémas courants :
- Interpolation de chaînes :
"\(.first) \(.last)" - Arithmétique :
(.price * 1.2 | round)pour une majoration de 20 % - Conditions :
if .score >= 90 then "A" else "B" end
L’exemple ci-dessous enrichit une liste d’employés en ajoutant un fullName calculé et une étiquette seniority basée sur le nombre d’années d’expérience.
#!/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)
})'Comprendre to_entries
to_entries convertit un objet JSON en un tableau de paires {key, value}. Cela permet d’appliquer des opérations sur les tableaux (map, select, sort) aux champs d’un objet, ce qui n’est pas possible directement sur un objet.
Exemple de transformation :
- Entrée :
{"a": 1, "b": 2} - Sortie :
[{"key": "a", "value": 1}, {"key": "b", "value": 2}]
L’opération inverse est from_entries, qui reconvertit ce tableau en objet. Ensemble, ces fonctions constituent l’idiome to_entries | map(...) | from_entries pour transformer des objets.
#!/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'Filtrer des clés avec to_entries
L’un des usages les plus pratiques de to_entries consiste à filtrer dynamiquement les clés à conserver ou à supprimer en fonction du nom de la clé lui-même, ce que la construction d’objet ne permet pas lorsque les noms des clés ne sont pas connus à l’avance.
Schéma :
to_entries | map(select(.key | test("regex"))) | from_entriesto_entries | map(select(.key != "secret")) | from_entries
L’extrait ci-dessous supprime toutes les clés qui commencent par un trait de soulignement (champs internes ou privés) avant de transmettre un objet de configuration à un service externe.
#!/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
'Renommer dynamiquement des clés avec to_entries
La construction d’objet renomme les clés lorsque vous connaissez leur nom au moment de l’écriture. to_entries vous permet de renommer les clés par programmation, par exemple en convertissant camelCase en snake_case ou en ajoutant un préfixe.
Dans map, vous mettez à jour le champ .key de chaque entrée, puis vous utilisez un canal vers from_entries :
map(.key |= gsub("(?<=[a-z])(?=[A-Z])"; "_") | .key |= ascii_downcase)— convertir camelCase en snake_casemap(.key |= "app_" + .)— ajouter un préfixe à chaque clé
L’exemple préfixe tous les noms de variables d’environnement par APP_ afin de les regrouper dans un espace de noms avant leur injection dans un conteneur.
#!/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 : la forme abrégée pratique
Le schéma to_entries | map(...) | from_entries est si courant que jq fournit une forme abrégée : with_entries(expr).
Elle est strictement équivalente, mais plus concise :
with_entries(.value |= . * 2)— doubler chaque valeur numériquewith_entries(select(.value != null))— supprimer les clés dont la valeur est nullewith_entries(.key |= ascii_upcase)— convertir toutes les clés en majuscules
L’extrait supprime toutes les clés dont la valeur est null ou une chaîne vide, une étape de nettoyage courante avant l’envoi d’une requête PATCH à une API REST.
#!/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"Combiner map et la construction d’objets dans une chaîne de traitement
Les transformations réelles enchaînent plusieurs opérations jq. Une chaîne de traitement typique pour préparer une charge utile d’API peut :
- Filtrer le tableau d’entrée avec
map(select(...)) - Remodeler chaque élément avec une construction d’objet
- Ajouter des champs calculés
- Trier le résultat
L’exemple ci-dessous lit une liste de mesures de serveurs, ne conserve que les serveurs dont l’utilisation du CPU est élevée et produit une charge utile d’alerte compacte prête à être envoyée par POST à un webhook.
#!/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"Construire un nouvel objet JSON à partir de plusieurs sources
jq peut fusionner des entrées et construire des objets provenant de plusieurs sources JSON à l’aide de l’opérateur d’addition + et de la liaison de variables avec as $var.
Schémas utiles :
obj1 + obj2— fusionner deux objets (la valeur de droite l’emporte en cas de conflit entre clés)--argjson— transmettre un deuxième document JSON sous forme de variable$ENV— lire directement les variables d’environnement dans jq
L’extrait fusionne une configuration de base avec des remplacements propres à l’environnement, un schéma courant pour gérer la configuration d’applications selon les principes des applications à douze facteurs dans les scripts shell.
#!/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"Vérification des connaissances : to_entries ou map
Vous disposez de l’objet JSON suivant et devez supprimer toutes les clés dont la valeur est inférieure à 0, afin de produire un nouvel objet contenant uniquement des valeurs positives ou nulles. Quelle expression jq permet d’obtenir ce résultat ?
Entrée : {"a": 10, "b": -3, "c": 0, "d": 5}
Récapitulatif de la leçon : transformer du JSON avec jq
Vous avez étudié les techniques essentielles pour remodeler du JSON avec jq :
- Construction d’objet
{}— créer de nouveaux objets en sélectionnant, renommant et calculant des champs à partir d’une entrée map(expr)— appliquer n’importe quelle transformation à chaque élément d’un tableau, notamment une construction d’objet imbriquée etselect()pour le filtrageto_entries/from_entries— convertir un objet en tableau de paires{key, value}, ce qui permet d’effectuer des opérations sur les clés et les valeurs, puis reconvertir le tableauwith_entries(expr)— forme abrégée et concise de la chaîne complète to_entries → map → from_entries- Fusion d’objets avec
+et--argjsonpour créer des charges utiles provenant de plusieurs sources
Ces éléments de base se combinent : filtrez avec select, remodelez avec la construction d’objets, enrichissez avec des champs calculés et enchaînez le tout dans une seule expression jq lisible. La maîtrise de ces schémas vous permet de manipuler pratiquement n’importe quelle charge utile JSON directement dans le shell, sans écrire de script dédié en Python ou Node.
Questions Fréquemment Posées
La leçon « Transformer et construire des objets JSON avec jq » est-elle gratuite ?
Oui — le texte complet de « Transformer et construire des objets JSON avec jq » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Linux Command Line & Bash Scripting Mastery, passe à CoddyKit PRO. Le cours Linux Command Line & Bash Scripting Mastery comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Transformer et construire des objets JSON avec jq » ?
Remodelez les données avec map, to_entries et la construction d’objets pour produire de nouvelles charges utiles JSON. Tu pratiques Linux Command Line & Bash Scripting Mastery avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Linux Command Line & Bash Scripting Mastery ?
Aucune expérience préalable n'est requise. Linux Command Line & Bash Scripting Mastery sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Transformer et construire des objets JSON avec jq » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Linux Command Line & Bash Scripting Mastery ?
Oui. Chaque leçon Linux Command Line & Bash Scripting Mastery inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Filtrer et sélectionner du JSON avec les pipelines jq
- Transformer et construire des objets JSON avec jq
- Consommer des API REST avec curl et jq
- Modifier des fichiers de configuration YAML avec yq