JQ: изменить несколько значений в выделенном объекте - PullRequest
0 голосов
/ 25 января 2020

У меня есть массив JSON объектов, и я пытаюсь изменить name и version для объекта данного @type со следующим вводом

[
 {
    "name": "oldname",
    "version": "oldversion",
    "@type": "Project"
 },
 {
    "name": "bomname",
    "version": "bomversion",
    "@type": "BOM"
 },
 {
    "name": "componentname",
    "version": "componentversion",
    "@type": "Component"
 }
]

I нашел много примеров для изменения одного значения, и я могу успешно сделать это, объединив несколько операторов select.

$ cat original.json | jq '[ .[] | (select(.["@type"] == "Project") | .name ) = "newname" | (select(.["@type"] == "Project") | .version ) = "newversion ] ' > renamed.json

Но я надеялся, что смогу сжать это, поэтому мне нужно выполнить select только один раз, чтобы изменить оба значения.

Ответы [ 2 ]

1 голос
/ 25 января 2020

Объединить объект с новыми значениями.

map(select(.["@type"] == "Project") * {name: "newname", version: "newversion"} // .)
1 голос
/ 25 января 2020

Используя ваш подход:

[ .[]
  | if .["@type"] == "Project" 
    then .name = "newname" | .version  = "newversion" 
    else . end ]

или, если вы хотите использовать select, вы можете написать:

map( (select(.["@type"] == "Project") | .name = "newname" | .version  = "newversion" ) // .)

или более экзотически:

(.[] | select(["@type"] == "Project"))
|= (.name = "newname" | .version  = "newversion" )
...