【问题标题】:How to add a bash array into the fields of a JSON array using jq?如何使用 jq 将 bash 数组添加到 JSON 数组的字段中?
【发布时间】:2020-10-31 15:16:40
【问题描述】:

我目前有来自echo $items | jq 的以下 JSON 输出:

{
  "Family_Name": "Type 1",
  "Quantity_On_Hand": "335"
}
{
  "Family_Name": "Type 2",
  "Quantity_On_Hand": "215"
}
{
  "Family_Name": "Type 9",
  "Quantity_On_Hand": "159"
}
{
  "Family_Name": "Type 4",
  "Quantity_On_Hand": "500"
}

我还有一个大小相同的 bash 数组 colors,看起来像

"Blue" "Red" "Green" "Blue"

我如何使用jq 来获得类似的东西

{
  "Family_Name": "Type 1",
  "Quantity_On_Hand": "335",
  "Colors": "Blue"
}
{
  "Family_Name": "Type 2",
  "Quantity_On_Hand": "215",
  "Colors": "Red"
}
{
  "Family_Name": "Type 9",
  "Quantity_On_Hand": "159",
  "Colors": "Green"
}
{
  "Family_Name": "Type 4",
  "Quantity_On_Hand": "500",
  "Colors": "Blue"
}

我尝试使用 jq --argjq -n '.{} |= [$colors]' 之类的东西,但无法正确使用。

【问题讨论】:

    标签: arrays json bash jq


    【解决方案1】:

    使用 jq 1.5 或更高版本,以及您的输入(即 JSON 对象流)和

    colors=("Blue" "Red" "Green" "Blue")
    

    以下生成所需 JSON 对象的数组:

    jq -s '
      ($ARGS.positional | map({Colors: .})) as $colors
      | [., $colors] | transpose | map(add)
    ' --args "${colors[@]}"
    

    如果您希望结果是 JSON 对象的流,您可以添加 [] 或 将transpose | map(add) 更改为transpose[] | add

    注意事项

    (1) 即使某些颜色的名称中有空格,上述解决方案也可以使用,但通常可能需要使用其他机制传入数组的内容。

    (2)如果你的jq不支持位置参数(--args),现在可能是升级的好时机;如果这不是一个选项,您可以设计一个解决方法,例如如果您的 jq 支持,请使用 --argfile 选项。

    【讨论】:

      【解决方案2】:

      这是一个已经在 jq 1.4 以后的版本中测试过的解决方案:

      jq -R -s --argfile json <(echo "$items") '
        (split("\n") | map(select(length>0))) as $colors
        | [ range(0; $colors|length) | $json[.] + {Colors: $colors[.]} ]
      ' <( printf "%s\n" "${colors[@]}" )
      

      这里的微妙之处在于-argfile 会将 JSON 对象流组合成一个数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多