【问题标题】:How do I use jq to append an array to this json string?如何使用 jq 将数组附加到此 json 字符串?
【发布时间】:2021-10-28 19:44:19
【问题描述】:

我想使用 jq 将此数组附加到此 json 字符串。我的结果只添加了 hello 元素

method=1234
arraynew=(hello world)
echo $arraynew
PAYLOAD=$( jq -Rn \
                  --arg method $method \
                  --arg array $arraynew \
                  '{method: [$method], values: $array}' )

我得到这个回报:

{ "method": [ "1234" ], "values": "hello" }

【问题讨论】:

  • 请将该示例输入的所需输出(无描述、无图像、无链接)添加到您的问题(无评论)。
  • 请阅读What should I do when someone answers my question?并将您的反馈应用于您得到的答案。
  • Anthony,自 8 月 4 日以来,您仍未接受并评价您从 5 个问题中得到的任何答案。再次,请花点时间查看这些问题,如果有帮助,请接受一个你。 Stack-overflow 是一个社区社交网络,人们互相帮助。您对答案的反馈与志愿者What should I do when someone answers my question? 的答案一样重要。请花时间对您得到的所有答案进行反馈。它很有价值,值得赞赏。

标签: bash jq


【解决方案1】:

试试看

jq '.[].method += [$method]'

【讨论】:

    【解决方案2】:

    引用$arraynew 之类的数组等同于${arraynew[0]}——你只会得到第一个元素。

    jq 期望 --arg 的值是字符串,所以我们需要将数组连接成一个字符串,然后在 jq 中拆分:

    jq -n \
       --arg method "$method" \
       --arg array  "$(printf '%s\n' "${arraynew[@]}")" \
        '
            {
                method: [$method],
                values: ($array | split("\n"))
            }    
        '
    
    {
      "method": [
        "1234"
      ],
      "values": [
        "hello",
        "world"
      ]
    }
    

    【讨论】:

    • 我认为同时使用-R-n 没有意义
    • -R 在使用inputinputs 时通常与-n 一起使用。
    【解决方案3】:

    首先,使用 jq 将您的 bash 数组转换为 json 数组

    printf '%s\0' "${arraynew[@]}" | jq -Rns 'input | split("\u0000")'
    
    [
      "hello",
      "world"
    ]
    

    然后,使用 --argjson 而不是 --arg 将其导入您的主 jq 脚本

    jsonarray="$(
      printf '%s\0' "${arraynew[@]}" | jq -Rns 'input | split("\u0000")'
    )"
    
    jq -Rn \
      --arg method "$method" \
      --argjson array "$jsonarray" \
      '{method: [$method], values: $array}'
    
    {
      "method": [
        "1234"
      ],
      "values": [
        "hello",
        "world"
      ]
    }
    

    【讨论】:

      【解决方案4】:

      您可以将数组元素作为位置参数传递:

      #!/usr/bin/env bash
      
      method=1234
      arraynew=(hello world)
      declare -p arraynew
      payload=$(
        jq -n '{method: $method, values: $ARGS.positional}' \
          --arg method "$method" \
          --args "${arraynew[@]}"
      )
      printf '%s\n' "$payload"
      

      但它有系统最大参数行长度的限制,因此只能用于较短的小元素数组。

      或者您可以将您的数组作为null-delimited 元素流传递,并让jq 将其读入一个字符串,以便在null 分隔符上拆分成这样的JSON 数组:

      #!/usr/bin/env bash
      
      method=1234
      arraynew=(hello world)
      declare -p arraynew
      
      payload=$(
        printf '%s\0' "${arraynew[@]}" |
        jq -Rs '{method: $method, values: split("\u0000")}' \
          --arg method "$method"
      )
      printf '%s\n' "$payload"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多