I'm trying to generate a json file within bash. I installed jq, hoping that it would help me generate and append json.
For example, I want to generate a json in this format:
{
  "Project": [
    {
      "projectName": {
        "branch": [
          {
            "branchName": [
              "path"
            ]
          }
        ],
        "tag": [
          {
            "tagName": [
              "path"
            ]
          }
        ]
      }
    }
  ]
}
While a can to something like that, with the following filter
 .Project=.Project+.Project+
  [{"projectName" : {"branch" : (.branch+[{"branchName":(.tagName+["path"])}]),
             "tag": (.tag+[{"tagName":(.tagName+["path"])}]) }}]
when I want to create another entry in the same project and name, it creates a whole new entry, has if it was a new project, resulting in this:
    {
      "Project": [
        {
          "projectName": {
            "branch": [
              {
                "branchName": [
                  "path"
                ]
              }
            ],
            "tag": [
              {
                "tagName": [
                  "path"
                ]
              }
            ]
          }
        },
        {
          "projectName": {
            "branch": [
              {
                "branchName": [
                  "path"
                ]
              }
            ],
            "tag": [
              {
                "tagName": [
                  "path"
                ]
              }
            ]
          }
        },
        {
          "projectName": {
            "branch": [
              {
                "branchName": [
                  "path2"
                ]
              }
            ],
            "tag": [
              {
                "tagName": [
                  "path2"
                ]
              }
            ]
          }
        }
      ]
    }
But I would like to have
{
  "Project": [
    {
      "projectName": {
        "branch": [
          {
            "branchName": [
              "path",
              "path2"
            ]
          }
        ],
        "tag": [
          {
            "tagName": [
              "path",
              "path2"
            ]
          }
        ]
      }
    }
  ]
}
Is there a way with jq/bash?
So, I'm taking a stab in the dark here (to mix metaphors), but this gives what seems to be the results you want:
cat test.json | jq '.Project[0].projectName.tag[0].tagName |= .+ ["path2"] | .Project[0].projectName.branch[0].branchName |= .+ ["path2"]'
The |= .+ [...] essentially appends a new array item. You can use the array specs for good effect for all array elements by omitting the 0 from, e.g., tag[0].
This produces:
{
  "Project": [
    {
      "projectName": {
        "tag": [
          {
            "tagName": [
              "path",
              "path2"
            ]
          }
        ],
        "branch": [
          {
            "branchName": [
              "path",
              "path2"
            ]
          }
        ]
      }
    }
  ]
}
Edit -- if I understand the new method now (but I could be missing something), we start with:
{
  "Project": {
    "projectName": {
      "tag": {
        "tagName": [
          "path",
        ]
      },
      "branch": {
        "branchName": [
          "path",
        ]
      }
    }
  }
}
Then set some variables and apply this transform:
Project=projectName ProjectNumber=path2 Branch=branchName Tag=tagName
jq ".Project.${Project}.tag.${Tag} |= .+ [\"${ProjectNumber}\"] | .Project.${Project}.branch.${Branch} |= .+ [\"${ProjectNumber}\"]"
And we get:
{
  "Project": {
    "projectName": {
      "tag": {
        "tagName": [
          "path",
          "path2"
        ]
      },
      "branch": {
        "branchName": [
          "path",
          "path2"
        ]
      }
    }
  }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With