Comment puis-je ajouter une variable à tous les éléments d'un tableau JSON existant?

Dec 08 2020

J'ai le tableau JSON suivant à partir d'un fichier json:

[
  {
    "key": "Ley1",
    "file": "Filepath1",
    "line": 10,
    "rule": "csharpsquid:S1643",
    "message": "Use a StringBuilder instead.",
    "type": "CODE_SMELL"
  },
  {
    "key": "Key2",
    "file": "FilePath2",
    "line": 12,
    "rule": "csharpsquid:S1643",
    "message": "Use a StringBuilder instead.",
    "type": "CODE_SMELL"
  }
]

et je veux ajouter la variable "critique" à tous ses éléments en utilisant une commande bash pour qu'elle ressemble à ceci:

[
      {
        "key": "Key1",
        "file": "Filepath1",
        "line": 10,
        "rule": "csharpsquid:S1643",
        "message": "Use a StringBuilder instead.",
        "type": "CODE_SMELL",
        "critical": "No"
      },
      {
        "key": "Key2",
        "file": "FilePath2",
        "line": 12,
        "rule": "csharpsquid:S1643",
        "message": "Use a StringBuilder instead.",
        "type": "CODE_SMELL",
        "critical": "Yes"
      }
    ]

Malheureusement, je suis un débutant complet en JSON et bash et je n'ai pas trouvé de commande bash pour résoudre ce problème. J'ai essayé un peu avec jq sur jq-play mais cela n'a pas vraiment abouti à quelque chose donc j'ai voulu l'essayer ici. J'espère que ce sont toutes les informations nécessaires, alors est-ce que quelqu'un connaît peut-être une commande pour cela?

EDIT: Cela a fonctionné ici, merci!

.[] |= . + {"critical": "No"}

Mais non, je veux déterminer la valeur de "oui" ou "non" en fonction de la valeur du fichier. Savez-vous comment éditer la commande pour qu'elle vérifie la valeur du fichier afin de déterminer la valeur critique?

Il devrait décider comme ceci:

Filepath1, Filepath3 mène à "critical" : "No"

et

Filepath2, Filepath4, Filepath5 mène à "critical" : "Yes"

Réponses

0stone0 Dec 08 2020 at 18:48

Vous pouvez utiliser une instruction jq if ;

jq '.[] |= . + {"critical": (if .file == "FilePath1" or .file == "FilePath3" then "no" else "yes" end)}'

Essayez-le sur jqPlay

peak Dec 09 2020 at 04:08

Pour minimiser la redondance, vous pouvez utiliser:

map(. + {critical: (if .file | IN("FilePath1", "FilePath3") then "no" else "yes" end) })

Ou par souci de concision:

map(. + {critical: ((.file | select(IN("FilePath1", "FilePath3")) | "no") // "yes" )})