¿Cómo puedo agregar una variable a todos los elementos de una matriz JSON existente?

Dec 08 2020

Tengo la siguiente matriz JSON de un archivo 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"
  }
]

y quiero agregar la variable "crítica" a todos los elementos usando un comando bash para que se vea así:

[
      {
        "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"
      }
    ]

Desafortunadamente, soy un principiante completo de JSON y bash y no pude encontrar un comando bash que resuelva este problema. Probé un poco con jq en jq-play pero realmente no condujo a nada, así que quería probarlo aquí. Espero que esta sea toda la información necesaria, entonces, ¿alguien sabe tal vez un comando para esto?

EDITAR: ¡Esto aquí funcionó, gracias!

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

Pero no, quiero determinar el valor de "sí" o "no" según el valor del archivo. ¿Sabe cómo editar el comando para que verifique el valor del archivo para determinar el valor crítico?

Debería decidir así:

Filepath1, Filepath3 conduce a "critical" : "No"

y

Filepath2, Filepath4, Filepath5 conduce a "critical" : "Yes"

Respuestas

0stone0 Dec 08 2020 at 18:48

Puede usar una instrucción if de jq ;

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

Pruébelo en jqPlay

peak Dec 09 2020 at 04:08

Para minimizar la redundancia, puede optar por:

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

O por brevedad:

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