Je veux ajouter un tableau avec des éléments et de la valeur dans un fichier json existant en utilisant jq.
J'ai déjà un fichier (input.json) avec
{
"id": 9,
"version": 0,
"lastUpdTs": 1532371267968,
"name": "Training"
}
Je veux ajouter ceci dans un autre tableau de groupes dans ce json (orig.json)
[
{
"name": "JAYS",
"sourceConnection": {
"name": "Oracle_connection",
"connectionType": "JDBC",
"commProtocol": "JDBC"
},
"checked": true,
"newlyAdded": false,
"id": null,
"groups": [],
"displayName": "SCOTT",
"defaultLevel": "MANAGED"
}
]
Le résultat final devrait ressembler à
[
{
"name": "JAYS",
"sourceConnection": {
"name": "Oracle_connection",
"connectionType": "JDBC",
"commProtocol": "JDBC"
},
"checked": true,
"newlyAdded": false,
"id": null,
"groups": [
{
"id": 9,
"version": 0,
"lastUpdTs": 1532371267968,
"name": "Training"
}
],
"displayName": "SCOTT",
"defaultLevel": "MANAGED"
}
]
Je sais comment ajouter des éléments dans un tableau, mais je ne sais pas comment passer à partir d'un fichier.
jq '.[].groups += [{"INPUT": "HERE"}]' ./orig.json
jq
possède un indicateur pour alimenter le contenu JSON réel avec son indicateur --argjson
. Ce que vous devez faire est de stocker le contenu du premier fichier JSON dans une variable dans le contexte de jq
et de le mettre à jour dans le second JSON
jq --argjson groupInfo "$(<input.json)" '.[].groups += [$groupInfo]' orig.json
La partie "$(<input.json)"
est une construction de re-direction de Shell pour sortir le contenu du fichier donné et avec l'argument --argjson
Elle est stockée dans la variable groupInfo
. Maintenant, vous l'ajoutez au tableau groups
dans la partie filtre réelle.
Autrement dit, la solution ci-dessus équivaut à le faire
jq --argjson groupInfo '{"id": 9,"version": 0,"lastUpdTs": 1532371267968,"name": "Training" }' \
'.[].groups += [$groupInfo]' orig.json
C'est le cas exact où la fonction input
est pour:
input
et les entrées [...] lues à partir des mêmes sources (par exemple, stdin, fichiers nommés sur la ligne de commande) que jq lui-même. Ces deux fonctions intégrées, et les propres actions de lecture de jq, peuvent être entrelacées.
Autrement dit, jq
lit un objet/une valeur dans le fichier et y exécute le pipeline, et n'importe où input
apparaît le suivant l'entrée est lue et est utilisée comme résultat de la fonction.
Cela signifie que vous pouvez faire:
jq '.[].groups += [input]' orig.json input.json
avec exactement la commande que vous avez déjà écrite, plus input
comme valeur. L'expression input
évaluera le (premier) objet lu dans le fichier suivant de la liste d'arguments, dans ce cas, tout le contenu de input.json
.
Si vous avez plusieurs éléments à insérer, vous pouvez utiliser inputs
à la place avec la même signification. Il s'appliquera également sur un ou plusieurs fichiers de la ligne de commande et [inputs]
représente tous les corps de fichier sous forme de tableau.
Il est également possible d'entrelacer des éléments pour traiter plusieurs fichiers orig
, chacun avec un fichier compagnon inséré, mais séparer les sorties serait un problème.