【问题标题】:Add json array element with jq (cmdline) [closed]使用 jq (cmdline) 添加 json 数组元素 [关闭]
【发布时间】:2014-10-14 09:49:23
【问题描述】:

我正在尝试在 bash 中生成一个 json 文件。我安装了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 有办法吗?

【问题讨论】:

  • 给出错误结果的 jq 字符串是什么?
  • 你从什么生成 json?目录结构?一个文本文件?其他的json?从无到有?什么?
  • @Etan,我正在使用的 jq 过滤器。 Projectname、BranchName、tagName 是变量,我通常应该具有相同的值,每次执行时路径会有所不同。实际上,这是由在 mercurial repo 上执行 doxygen 文件的脚本运行的。所以我

标签: bash ubuntu jq


【解决方案1】:

所以,我在这里暗中尝试(混合隐喻),但这似乎是你想要的结果:

cat test.json | jq '.Project[0].projectName.tag[0].tagName |= .+ ["path2"] | .Project[0].projectName.branch[0].branchName |= .+ ["path2"]'

|= .+ [...] 本质上附加了一个新的数组项。您可以通过省略 0 中的 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"
        ]
      }
    }
  }
}

【讨论】:

  • 这不是我想要的,但我可以稍微改变一下我用来完成这项工作的格式。 tagname、branchname 和 projectname 在每次执行时可能会有所不同,但是通过删除“tag”和“branch”中的数组使它们成为对象,它可以工作!
  • 我使用了这个过滤器:jq ".Project.${Project}.tag.${Tag} |= .+ [\"${ProjectNumber}\"] | .Project.${Project }.branch.${Branch} |= .+ [\"${ProjectNumber}\"]" /var/www/doc/version.json,它没有创建我想要的确切结果,但它的结果很接近足够它做我想要的。它只是不在数组中。
猜你喜欢
  • 2021-08-14
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多