73 votes

Ajouter un nouvel élément à un tableau JSON existant à l'aide de jq

J'ai un fichier json et je veux ajouter un nouveau tableau d'objets sur elle. Je suis en train d'utiliser jq ligne de commande. Comme je cherchais à internet cette commande est à faire, pas seulement pour les objets de requête au fichier Json. Mais je ne peux pas comprendre comment utiliser la commande AJOUTER jq. Mon fichier Json est le rapport-2017-01-07.json >>

{  
   "report":"1.0",
   "data":{  
      "date":"2010-01-07",
      "messages":[  
         {  
            "date":"2010-01-07T19:58:42.949Z",
            "xml":"xml_samplesheet_2017_01_07_run_09.xml",
            "status":"OK",
            "message":"metadata loaded into iRODS successfully"
         },
         {  
            "date":"2010-01-07T20:22:46.949Z",
            "xml":"xml_samplesheet_2017_01_07_run_09.xml",
            "status":"NOK",
            "message":"metadata duplicated into iRODS"
         },
         {  
            "date":"2010-01-07T22:11:55.949Z",
            "xml":"xml_samplesheet_2017_01_07_run_09.xml",
            "status":"NOK",
            "message":"metadata was not validated by XSD schema"
         }
      ]
   }
}

Je suis l'aide de la commande ci-dessous > > >

$ cat report-2017-01-07.json | jq -s '.data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}'
jq: error: syntax error, unexpected '{', expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.data.messages {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}               
jq: 1 compile error

J'ai déjà essayé une autre commandes combinaison, mais je suis toujours à la fin avec l'erreur de compilation. Toute allusion à ce sujet? Merci!

la sortie doit ressembler à >>

{
    "report": "1.0",
    "data": {
        "date": "2010-01-07",
        "messages": [{
            "date": "2010-01-07T19:58:42.949Z",
            "xml": "xml_samplesheet_2017_01_07_run_09.xml",
            "status": "OK",
            "message": "metadata loaded into iRODS successfully"
        }, {
            "date": "2010-01-07T20:22:46.949Z",
            "xml": "xml_samplesheet_2017_01_07_run_09.xml",
            "status": "NOK",
            "message": "metadata duplicated into iRODS"
        }, {
            "date": "2010-01-07T22:11:55.949Z",
            "xml": "xml_samplesheet_2017_01_07_run_09.xml",
            "status": "NOK",
            "message": "metadata was not validated by XSD schema"
        }, {
            "date": "2010-01-07T19:55:99.999Z",
            "xml": "xml_samplesheet_2017_01_07_run_09.xml",
            "status": "OKKKKKKK",
            "message": "metadata loaded into iRODS successfullyyyyy"
        }]
    }
}

114voto

Inian Points 36223

L' |= .+ part dans le filtre ajoute un nouvel élément à l'ensemble existant. Vous pouvez utiliser l' jq avec filtre

jq '.data.messages[3] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' inputJson

Pour éviter l'utilisation de la codé en dur la valeur de la longueur de 3 et dynamiquement ajouter un nouvel élément, utilisez . | length qui retourne la longueur, qui peut être utilisé comme le prochain tableau d'index, c'est à dire

jq '.data.messages[.data.messages| length] |= . + {"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}' inputJson

(ou) conformément à la pointe de la suggestion dans les commentaires, à l'aide de l' += opérateur seul

jq '.data.messages += [{"date": "2010-01-07T19:55:99.999Z", "xml": "xml_samplesheet_2017_01_07_run_09.xml", "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}]'

qui produit la sortie que vous en avez besoin.

{
  "report": "1.0",
  "data": {
    "date": "2010-01-07",
    "messages": [
      {
        "date": "2010-01-07T19:58:42.949Z",
        "xml": "xml_samplesheet_2017_01_07_run_09.xml",
        "status": "OK",
        "message": "metadata loaded into iRODS successfully"
      },
      {
        "date": "2010-01-07T20:22:46.949Z",
        "xml": "xml_samplesheet_2017_01_07_run_09.xml",
        "status": "NOK",
        "message": "metadata duplicated into iRODS"
      },
      {
        "date": "2010-01-07T22:11:55.949Z",
        "xml": "xml_samplesheet_2017_01_07_run_09.xml",
        "status": "NOK",
        "message": "metadata was not validated by XSD schema"
      },
      {
        "date": "2010-01-07T19:55:99.999Z",
        "xml": "xml_samplesheet_2017_01_07_run_09.xml",
        "status": "OKKK",
        "message": "metadata loaded into iRODS successfullyyyyy"
      }
    ]
  }
}

Utilisation jq-jouer à la marche à sec de votre jq-filter et optimiser quelle que soit la façon dont vous le souhaitez.

51voto

peak Points 71

Plutôt que d'utiliser |= ici, il est préférable d'utiliser += :

 .data.messages += [{"date": "2010-01-07T19:55:99.999Z",
   "xml": "xml_samplesheet_2017_01_07_run_09.xml",
   "status": "OKKK", "message": "metadata loaded into iRODS successfullyyyyy"}]
 

Prepend

D'un autre côté, si (comme @NicHuang l'a demandé) vous souhaitez ajouter l'objet JSON au début du tableau, vous pouvez utiliser le modèle:

  .data.messages |= [ _ ] + .
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X