linux 如何在有引号的情况下向现有JSON文件添加密钥对值

wi3ka0sx  于 4个月前  发布在  Linux
关注(0)|答案(3)|浏览(77)

我有一个现有的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定义为字符串和数组,但我也没有得到“”和。

gcxthw6b

gcxthw6b1#

下面是使用jq导入数据的方法:

  • 使用--arg varname "value"访问jq变量$varname,该变量设置为字符串value
  • 使用--args "value1" "value2" …(作为最后一个参数)将内置$ARGS.positional设置为字符串数组["value1", "value2", …]
  • 使用.ressummary.Check = […]Check字段设置为定义的数组(或.ressummary.Check += […]附加到该数组)
#!/bin/bash

ccheck=("A_DOG" "A_CAT" "A_MOUSE" "A_HORSE")
code="C/C++"
jq --arg code "$code" '.ressummary.Check = [{Check: $ARGS.positional, $code}]' \
   key.json --args "${ccheck[@]}"

个字符

fnatzsnv

fnatzsnv2#

下面是我的jq shell命令行:

cat input.json insert.json | jq -s ".[0] * (.[0].ressummary * .[1] | {ressummary:.})"

个字符
input.json

{
    "resstart": 1700839261,
    "resend": 1700839965,
    "resop": "SUCCESS",
    "resurl": "http://xxxx/",
    "ressummary": {
        "value": 1,
        "expect": 0,
        "tool": "abc"
    }
}


insert.json

{
    "Check": [
        {
            "Check": [
                "A_DOG",
                "A_CAT",
                "A_HORSE"
            ],
            "code": "C/C++"
        }
    ]
}


其结果是:

{
  "resstart": 1700839261,
  "resend": 1700839965,
  "resop": "SUCCESS",
  "resurl": "http://xxxx/",
  "ressummary": {
    "value": 1,
    "expect": 0,
    "tool": "abc",
    "Check": [
      {
        "Check": [
          "A_DOG",
          "A_CAT",
          "A_HORSE"
        ],
        "code": "C/C++"
      }
    ]
  }
}


解释
我只是解释第一个语句。我们需要正确的ressummary

{
...
"ressummary": {
    "value": 1,
    "expect": 0,
    "tool": "abc",
    "Check": [
      {
        "Check": [
          "A_DOG",
          "A_CAT",
          "A_HORSE"
        ],
        "code": "C/C++"
      }
    ]
  }
}


所以基本上我们只需要将insert.json合并到ressummary

.[0].ressummary * .[1]


使用此语句将使JSON文件看起来像这样。

{
  "value": 1,
  "expect": 0,
  "tool": "abc",
  "Check": [
    {
      "Check": [
        "A_DOG",
        "A_CAT",
        "A_HORSE"
      ],
      "code": "C/C++"
    }
  ]
}


这应该放在ressummary下:

.[0].ressummary * .[1] | {ressummary:.}


使用此语句将得到如下所示的JSON:

{
  "ressummary": {
    "value": 1,
    "expect": 0,
    "tool": "abc",
    "Check": [
      {
        "Check": [
          "A_DOG",
          "A_CAT",
          "A_HORSE"
        ],
        "code": "C/C++"
      }
    ]
  }
}


然后我们可以将其合并到原始输入中。

.[0] * (.[0].ressummary * .[1] | {ressummary:.})


使用括号表示优先级运算.[0].ressummary * .[1] | {ressummary:.}
PS:将-sjq一起使用将使其将多个输入作为数组读取,如下所示:

[
  {
    "resstart": 1700839261,
    "resend": 1700839965,
    "resop": "SUCCESS",
    "resurl": "http://xxxx/",
    "ressummary": {
      "value": 1,
      "expect": 0,
      "tool": "abc"
    }
  },
  {
    "Check": [
      {
        "Check": [
          "A_DOG",
          "A_CAT",
          "A_HORSE"
        ],
        "code": "C/C++"
      }
    ]
  }
]


但是我仍然推荐使用Python来处理JSON。

2j4z5cfb

2j4z5cfb3#

要使用jq在JSON文件中实现所需的结果,需要稍微修改方法。
1.读取现有JSON:首先,使用jq读取现有JSON文件。
1.修改JSON:在“ressummary”下添加新的“Check”部分。由于您正在处理字符串数组,并且需要保留字符串中的引号,因此需要小心处理。
1.写回修改后的JSON:最后,将修改后的JSON输出回文件。

#!/bin/bash

# The name of your JSON file
name="key.json"

# The array of items for the "Check" key
ccheck=("A_DOG" "A_CAT" "A_MOUSE" "A_HORSE")

# Convert array to a JSON array of strings
json_array=$(printf '%s\n' "${ccheck[@]}" | jq -R . | jq -s .)

# Use jq to add the new "Check" section under "ressummary"
jq --argjson arr "$json_array" \
   '.ressummary.Check = [{"Check": $arr | join(","), "code": "C/C++"}]' \
   "$name" > temp.json && mv temp.json "$name"

# Display the updated JSON
cat "$name"

字符串

  • 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文件中。

相关问题