如何使用jq将JSON文件中对象的单值替换为数组?
解决jq替换JSON值为数组时变成字符串的问题
你的问题出在变量传递的类型处理上:
- 用
--arg传递给jq的变量默认是字符串类型,哪怕你的objectshost_array是JSON数组格式的字符串,jq也会把它当成普通字符串赋值,所以最终host会变成带转义引号的字符串,而非真正的数组。
方案1:合并操作,直接在jq内完成分割赋值
不需要提前生成数组字符串,直接在同一个jq命令里完成字符串分割和赋值,避免类型转换问题:
#!/bin/bash objectshost="1.1.1.1,2.2.2.2" # 直接在jq内部将逗号分隔字符串分割为数组并赋值 jq --arg arg "$objectshost" '.objects.host = ($arg | split(","))' ./test.json > ./test.json.tmp
执行后得到的test.json.tmp内容就是你期望的结果:
{ "objects": { "type": "foo", "host": ["1.1.1.1","2.2.2.2"], "port": "1234" } }
方案2:用--argjson传递JSON类型变量
如果一定要保留先生成数组JSON的步骤,需要使用--argjson代替--arg,它会自动将传入的JSON格式字符串解析为jq的原生JSON类型(数组、对象等):
#!/bin/bash objectshost="1.1.1.1,2.2.2.2" # 生成JSON数组格式的字符串 objectshost_array=$(jq -c -n --arg arg "$objectshost" '$arg|split(",")') # 用--argjson传递并解析为JSON数组 jq --argjson value "$objectshost_array" '.objects.host = $value' ./test.json > ./test.json.tmp
这个方案同样能得到正确的数组结果。
内容的提问来源于stack exchange,提问作者buanet
相关产品推荐
相关产品推荐

