Como posso adicionar uma variável a todos os itens de uma matriz JSON existente?

Dec 08 2020

Eu tenho a seguinte matriz JSON de um arquivo 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"
  }
]

e eu quero adicionar a variável "crítica" a todos os itens dela usando um comando bash para que fique assim:

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

Infelizmente, sou um completo iniciante em JSON e bash e não consegui encontrar um comando bash que resolvesse esse problema. Eu tentei um pouco com jq no jq-play, mas realmente não resultou em algo, então eu queria tentar aqui. Espero que sejam todas as informações necessárias, alguém conhece talvez um comando para isso?

EDIT: Isso aqui funcionou, obrigado!

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

Mas não, eu quero determinar o valor de "sim" ou "não" dependendo do valor do arquivo. Você sabe como editar o comando para que ele verifique o valor do arquivo para determinar o valor crítico?

Deve decidir assim:

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

e

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

Respostas

0stone0 Dec 08 2020 at 18:48

Você pode usar uma instrução jq if ;

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

Experimente no jqPlay

peak Dec 09 2020 at 04:08

Para minimizar a redundância, você pode escolher:

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

Ou por brevidade:

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