如何使用jq将json文件中的对象值替换为数组?[duplicate]

pexxcrt2  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(110)
    • 此问题在此处已有答案**:

bash & jq: add attribute with object value(2个答案)
Passing variable in jq to filter with select fails(1个答案)
昨天关门了。
我只是在bash脚本中使用jq,尝试用数组替换json文件中的对象值,json文件(截短)如下所示:

{
  "objects": {
    "type": "foo",
    "host": "1.1.1.1",
    "port": "1234"
  }
}

我想用不同值的数组替换主机对象的值,因此它看起来像这样:

{
  "objects": {
    "type": "foo",
    "host": ["1.1.1.1","2.2.2.2"],
    "port": "1234"
  }
}

我用这个脚本测试了一下,输入来自一个简单的逗号分隔的字符串,我把它转换成一个合适的json数组(看起来可以工作),但是我不能用数组替换值。

#!/bin/bash
objectshost="1.1.1.1,2.2.2.2"
objectshost_array=$(jq -c -n --arg arg $objectshost '$arg|split(",")')

jq --arg value "$objectshost_array" '.objects.host = $value' ./test.json > ./test.json.tmp

我最后得到的,是这个:

{
  "objects": {
    "type": "foo",
    "host": "[\"1.1.1.1\",\"2.2.2.2\"]",
    "port": "1234"
  }
}

结果似乎是某种逻辑结果,因为脚本只是用数组字符串替换了值,但这不是我所期望得到的。)
我发现了一些类似的问题,但它们都是处理替换现有数组或键/值对中的值,但我的问题似乎是从单个值到数组的转换。
有人能把我推到正确的方向吗?或者我应该忘记jq,把json文件当作一个简单的文本文件来威胁?
先谢谢你,
安德烈

dxpyg8gm

dxpyg8gm1#

它可以使用参数的条件赋值:

jq '
.objects.host = (
  .objects.host |
  if type == "array"
  then .
  else [ . ]
  end + $ARGS.positional
)
' input.json --args 1.2.3.4 2.2.2.2 4.4.4.4

或与独立jq脚本相同;更易于阅读和维护:
myJQScript

#!/usr/bin/env -S jq --from-file --args

.objects.host = (
  .objects.host |
  if type == "array"
  then .
  else [ . ]
  end + $ARGS.positional
)

使其可执行:

chmod +x myJQScript

使用参数运行它以将数组条目添加到主机

$ ./myJQScript 1.2.3.4 2.2.2.2 4.4.4.4 < input.json
{
  "objects": {
    "type": "foo",
    "host": [
      "1.1.1.1",
      "1.2.3.4",
      "2.2.2.2",
      "4.4.4.4"
    ],
    "port": "1234"
  }
}
wqsoz72f

wqsoz72f2#

您可以使用一个jq命令来完成此操作:

#!/bin/sh
objectshost="1.1.1.1,2.2.2.2"

jq --arg value "$objectshost" '.objects.host = ($value / ",")' ./test.json > ./test.json.tmp

这样做的另一个好处是不需要Bash数组,但可以与任何shell一起使用。
如果您已经有了JSON数组,则必须使用--argjson而不是--arg--arg总是创建字符串类型的变量,但是--argjson会将该值解析为JSON实体。

#!/bin/bash
objectshost="1.1.1.1,2.2.2.2"
objectshost_array=$(printf '%s\n' "$objectshost" | jq -c 'split(",")')

jq --argjson value "$objectshost_array" '.objects.host = $value' ./test.json > ./test.json.tmp

相关问题