使用 jq 从变量创建嵌套 json 文件

使用 jq 从变量创建嵌套 json 文件

我有一个脚本,我在其中存储变量并使用它尝试创建 json 输出到文件。这是我的 json 构建格式

#!/bin/bash
JSON_STRING=$(jq -n \
                  --arg configId "$configid" \
                  --arg objectname "tempfile" \
                  --arg artifacts "[{ "name" : "oer", "version" : "$ot" }]" \
                  --arg test "2021" \
                   '$ARGS.named') > output.json
                  

所需的 json o/p (output.json) -

{ "configId": "c8f", "objectname": "tempfile", "artifacts": [{ "name" : "oer", "version" : "1.01" }], "test" : "2021"}

这里我没有得到期望的输出。任何帮助都很好

答案1

我会分两步完成:(编辑:工件是一个对象数组)

inner=$(jq -n --arg name oer \
              --arg version "$ot" \
              '$ARGS.named'
)
final=$(jq -n --arg configId "$configid" \
              --arg objectname "tempfile" \
              --arg test "2021" \
              --argjson artifacts "[$inner]" \
              '$ARGS.named'
)
echo "$final"
{
  "configId": "c8f",
  "objectname": "tempfile",
  "artifacts": [
    {
      "name": "oer",
      "version": "1.01"
    }
  ],  "test": "2021"
}

-c如果您希望最终输出为一行,请添加 a 。


答案2

在命令行上创建 JSON 的最安全方法是使用为您构建 JSON 的工具jq。但是,由于您有一个嵌套结构,您可能希望在单独的调用中创建该子jq结构由格伦·杰克曼饰演

另一种方法可以实现他们所展示的功能,但一次完成:

jq -n \
    --arg configId "$configid" \
    --arg objectname tempfile \
    --argjson artifacts "$( 
        jq -n \
            --arg name oer \
            --arg version "$ot" \
            '$ARGS.named'
    )" \
    --arg test 2021 \
    '$ARGS.named'

我们使用--argjson而不是--arg包含来自内部的 JSON 文档jq,因为它是一个 JSON 文档而不是需要编码的字符串。

您也可以使用jo,这可能会减少一点打字,

jo  configId="$configid" \
    objectname=tempfile \
    artifacts="$( jo name=oer version="$ot" )" \
    test=2021

该实用程序的描述 jo可在此处找到:https://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/

答案3

您没有获得输出,因为您将输出保存在变量中,因此没有任何内容可以重定向到文件。你可以这样做:

variable=$(command)

或这个:

command > file

但你不能这样做,variable=$(command) > file因为没有什么可以重定向。因此,尽管上面的代码将运行并创建和/或覆盖file,但该文件将始终为空,因为您已经将命令的输出保存在变量中。

因此,如果你们都想将输出保存在变量中并将其保存到文件中,则需要如下所示的内容:

JSON_STRING=$(jq -n \
                  --arg configId "$configid" \
                  --arg objectname "tempfile" \
                  --arg artifacts "[{ "name" : "oer", "version" : "$ot" }]" \
                  --arg test "2021" \
                   '$ARGS.named')
printf '%s\n' "$JSON_STRING" > output.json

答案4

看来您希望artifacts被视为 JSON 数组。如果是这种情况,请使用--argjson代替--arg并修复您的报价:

jq -n \
  --arg configId "$configid" \
  --arg objectname "tempfile" \
  --argjson artifacts "[{ \"name\" : \"oer\", \"version\" : \"$ot\" }]" \
  --arg test "2021" \
   '$ARGS.named'

这应该导致:

{
  "configId": "",
  "objectname": "tempfile",
  "artifacts": [
    {
      "name": "oer",
      "version": "1.01"
    }
  ],
  "test": "2021"
}

相关内容