Добавить элемент массива json с помощью jq (cmdline)
Я пытаюсь создать файл JSON в Bash. Я установил jq, надеясь, что это поможет мне сгенерировать и добавить json.
Например, я хочу создать JSON в этом формате:
{
"Project": [
{
"projectName": {
"branch": [
{
"branchName": [
"path"
]
}
],
"tag": [
{
"tagName": [
"path"
]
}
]
}
}
]
}
Пока может что-то подобное, со следующим фильтром
.Project=.Project+.Project+
[{"projectName" : {"branch" : (.branch+[{"branchName":(.tagName+["path"])}]),
"tag": (.tag+[{"tagName":(.tagName+["path"])}]) }}]
Когда я хочу создать еще одну запись в том же проекте и имени, он создает новую запись, если это был новый проект, в результате чего:
{
"Project": [
{
"projectName": {
"branch": [
{
"branchName": [
"path"
]
}
],
"tag": [
{
"tagName": [
"path"
]
}
]
}
},
{
"projectName": {
"branch": [
{
"branchName": [
"path"
]
}
],
"tag": [
{
"tagName": [
"path"
]
}
]
}
},
{
"projectName": {
"branch": [
{
"branchName": [
"path2"
]
}
],
"tag": [
{
"tagName": [
"path2"
]
}
]
}
}
]
}
Но я бы хотел иметь
{
"Project": [
{
"projectName": {
"branch": [
{
"branchName": [
"path",
"path2"
]
}
],
"tag": [
{
"tagName": [
"path",
"path2"
]
}
]
}
}
]
}
Есть ли способ с JQ / Bash?
1 ответ
Итак, я делаю удар здесь в темноте (чтобы смешать метафоры), но это дает то, что, кажется, дает желаемый результат:
cat test.json | jq '.Project[0].projectName.tag[0].tagName |= .+ ["path2"] | .Project[0].projectName.branch[0].branchName |= .+ ["path2"]'
|= .+ [...]
по существу добавляет новый элемент массива. Вы можете использовать спецификации массива для хорошего эффекта для всех элементов массива, опуская 0
от, например, tag[0]
,
Это производит:
{
"Project": [
{
"projectName": {
"tag": [
{
"tagName": [
"path",
"path2"
]
}
],
"branch": [
{
"branchName": [
"path",
"path2"
]
}
]
}
}
]
}
Изменить - если я понимаю новый метод сейчас (но я мог что-то упустить), мы начнем с:
{
"Project": {
"projectName": {
"tag": {
"tagName": [
"path",
]
},
"branch": {
"branchName": [
"path",
]
}
}
}
}
Затем установите некоторые переменные и примените это преобразование:
Project=projectName ProjectNumber=path2 Branch=branchName Tag=tagName
jq ".Project.${Project}.tag.${Tag} |= .+ [\"${ProjectNumber}\"] | .Project.${Project}.branch.${Branch} |= .+ [\"${ProjectNumber}\"]"
И мы получаем:
{
"Project": {
"projectName": {
"tag": {
"tagName": [
"path",
"path2"
]
},
"branch": {
"branchName": [
"path",
"path2"
]
}
}
}
}