Vous êtes vous déjà demandé comment découper un JSON en plusieurs “sous-“fichiers” ?
Si oui, cette ligne de commande est faite pour vous !
La seule dépendance ici est l’utilisation de l’outils jq.
Je vous encourage d’ailleurs à regarder cet outil très puissant sur la manipulation de JSON.
TL;DR
jq -c -M '.[]' myfile.json | \
while read line; do echo $line > $(echo $line | jq -r -c ".id").json; done
La commande va parser le fichier myfile.json
et créer 1 fichier pour chaque id
trouvé.
Cela fonctionne également en récupérant directement la sortie d’un service / API…
Exemple
echo '[{ "id": "16", "name": "produit 1" }, { "id": "17", "name": "produit 2" }, { "id": "18", "name": "produit 3" }, { "id": "19", "name": "produit 4" }]' | \
jq -c -M '.[]' | \
while read line; do \
echo $line > $(echo $line | jq -r -c ".id").json; \
done
Détails
Parsing du fichier JSON initial
jq -c -M '.[]' myfile.json
On va parser le fichier myfile.json
et récupérér 1 ligne pour chaque entrée de 1er niveau.
Lire chaque ligne et créer le json associé
Tant qu’il y a des lignes, on boucle dessus.
while read line; do
...
done
On renvoi ensuite la ligne et on utilise de nouveau jq pour récupérer l’id afin de nommer le fichier
echo $line > $(echo $line | jq -r -c ".id").json;
Fichier myfile.json
[
{
"id": "16",
"name": "produit 1"
},
{
"id": "17",
"name": "produit 2"
},
{
"id": "18",
"name": "produit 3"
},
{
"id": "19",
"name": "produit 4"
}
]
Options de la commande
-c compact instead of pretty-printed output;
: nous permet d’avoir 1 ligne affiché par résultat-M monochrome (don't colorize JSON);
: purement esthétique pour ne pas risquer de polluer l’extraction-r output raw strings, not JSON texts;
: permet de supprimer le guillemet de sortir de notre ID.
Bonus : Ajouter des informations à un fichier JSON
$ jq '. += { "category": "ma categoie", "subcategory": "ma sous categorie" }' 19.json
jq va ajouter les entrées category
et subcategory
au fichier 19.json
lors de l’affichage.
Il vous ai bien entendu ensuite possible de passer ce nouveau JSON à un nouveau fichier et l’enregistrer.