我有一个现有的key.json文件,看起来像这样:
key.json
{
"resstart": 1700839261,
"resend": 1700839965,
"resop": "SUCCESS",
"resurl": "http://xxxx/",
"ressummary": {
"value": 1,
"expect": 0,
"tool": "abc"
},
}
字符串
我需要在ressummary下的json中添加以下部分
"Check": [
{
"Check": "["A_DOG","A_CAT", "A_HORSE"]",
"code": "C/C++"
}
]
型
所以最终的json文件应该是这样的:
{
"resstart": 1700839261,
"resend": 1700839965,
"resop": "SUCCESS",
"resurl": "http://xxxx/",
"ressummary": {
"value": 1,
"expect": 0,
"tool": "abc"
"Check": [
{
"Check": "["A_DOG","A_CAT", "A_MOUSE", "A_HORSE"]",
"code": "C/C++"
}
]
},
}
型
我使用shell脚本来生成上面的json。我的代码是:
name="key"
ccheck=("A_DOG" "A_CAT" "A_MOUSE" "A_HORSE")
echo "{"Check": { "Check": "\['$ccheck[@]'\]", "code": "C/C++"}}" >> $name.json
sed -i "s/'/"/g" $name.json
cat $name.json
型
我得到下面的错误:解析错误:jq1编译错误
有谁能告诉我如何得到想要的json文件吗?我想用jq来实现。有没有更好的方法来实现?我试过将ccheck定义为字符串和数组,但我也没有得到“”和。
3条答案
按热度按时间gcxthw6b1#
下面是使用jq导入数据的方法:
--arg varname "value"
访问jq变量$varname
,该变量设置为字符串value
--args "value1" "value2" …
(作为最后一个参数)将内置$ARGS.positional
设置为字符串数组["value1", "value2", …]
.ressummary.Check = […]
将Check
字段设置为定义的数组(或.ressummary.Check += […]
附加到该数组)个字符
fnatzsnv2#
下面是我的
jq
shell命令行:个字符
input.json
:型
insert.json
:型
其结果是:
型
解释
我只是解释第一个语句。我们需要正确的
ressummary
:型
所以基本上我们只需要将
insert.json
合并到ressummary
。型
使用此语句将使JSON文件看起来像这样。
型
这应该放在
ressummary
下:型
使用此语句将得到如下所示的JSON:
型
然后我们可以将其合并到原始输入中。
型
使用括号表示优先级运算
.[0].ressummary * .[1] | {ressummary:.}
PS:将
-s
与jq
一起使用将使其将多个输入作为数组读取,如下所示:型
但是我仍然推荐使用Python来处理JSON。
2j4z5cfb3#
要使用jq在JSON文件中实现所需的结果,需要稍微修改方法。
1.读取现有JSON:首先,使用jq读取现有JSON文件。
1.修改JSON:在“ressummary”下添加新的“Check”部分。由于您正在处理字符串数组,并且需要保留字符串中的引号,因此需要小心处理。
1.写回修改后的JSON:最后,将修改后的JSON输出回文件。
字符串
printf '%s\n' "${ccheck[@]}" | jq -R . | jq -s .
:脚本的这一部分将bash数组ccheck
转换为JSON数组。jq -R
读取原始字符串(每行一个),jq -s
将它们转换为数组。jq
命令将此数组添加到“ressummary”中的“Check”键下。我们使用join(",")
将数组转换为字符串表示,其中包括所需的引号。temp.json
),然后重命名为您的原始文件名。这是使用jq
修改文件的一种更安全的方法。在
key.json
文件所在的目录下运行此脚本。它将根据您的要求将指定的部分添加到JSON文件中。