web-dev-qa-db-fra.com

jq - ajoute des objets du fichier dans le tableau json

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
9
CLO

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
9
Inian

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.

7
Michael Homer