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

wi3ka0sx  于 2024-01-06  发布在  Linux
关注(0)|答案(3)|浏览(333)

我有一个现有的key.json文件,看起来像这样:
key.json

  1. {
  2. "resstart": 1700839261,
  3. "resend": 1700839965,
  4. "resop": "SUCCESS",
  5. "resurl": "http://xxxx/",
  6. "ressummary": {
  7. "value": 1,
  8. "expect": 0,
  9. "tool": "abc"
  10. },
  11. }

字符串
我需要在ressummary下的json中添加以下部分

  1. "Check": [
  2. {
  3. "Check": "["A_DOG","A_CAT", "A_HORSE"]",
  4. "code": "C/C++"
  5. }
  6. ]


所以最终的json文件应该是这样的:

  1. {
  2. "resstart": 1700839261,
  3. "resend": 1700839965,
  4. "resop": "SUCCESS",
  5. "resurl": "http://xxxx/",
  6. "ressummary": {
  7. "value": 1,
  8. "expect": 0,
  9. "tool": "abc"
  10. "Check": [
  11. {
  12. "Check": "["A_DOG","A_CAT", "A_MOUSE", "A_HORSE"]",
  13. "code": "C/C++"
  14. }
  15. ]
  16. },
  17. }


我使用shell脚本来生成上面的json。我的代码是:

  1. name="key"
  2. ccheck=("A_DOG" "A_CAT" "A_MOUSE" "A_HORSE")
  3. echo "{"Check": { "Check": "\['$ccheck[@]'\]", "code": "C/C++"}}" >> $name.json
  4. sed -i "s/'/"/g" $name.json
  5. 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 += […]附加到该数组)
  1. #!/bin/bash
  2. ccheck=("A_DOG" "A_CAT" "A_MOUSE" "A_HORSE")
  3. code="C/C++"
  4. jq --arg code "$code" '.ressummary.Check = [{Check: $ARGS.positional, $code}]' \
  5. key.json --args "${ccheck[@]}"

个字符

fnatzsnv

fnatzsnv2#

下面是我的jq shell命令行:

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

个字符
input.json

  1. {
  2. "resstart": 1700839261,
  3. "resend": 1700839965,
  4. "resop": "SUCCESS",
  5. "resurl": "http://xxxx/",
  6. "ressummary": {
  7. "value": 1,
  8. "expect": 0,
  9. "tool": "abc"
  10. }
  11. }


insert.json

  1. {
  2. "Check": [
  3. {
  4. "Check": [
  5. "A_DOG",
  6. "A_CAT",
  7. "A_HORSE"
  8. ],
  9. "code": "C/C++"
  10. }
  11. ]
  12. }


其结果是:

  1. {
  2. "resstart": 1700839261,
  3. "resend": 1700839965,
  4. "resop": "SUCCESS",
  5. "resurl": "http://xxxx/",
  6. "ressummary": {
  7. "value": 1,
  8. "expect": 0,
  9. "tool": "abc",
  10. "Check": [
  11. {
  12. "Check": [
  13. "A_DOG",
  14. "A_CAT",
  15. "A_HORSE"
  16. ],
  17. "code": "C/C++"
  18. }
  19. ]
  20. }
  21. }


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

  1. {
  2. ...
  3. "ressummary": {
  4. "value": 1,
  5. "expect": 0,
  6. "tool": "abc",
  7. "Check": [
  8. {
  9. "Check": [
  10. "A_DOG",
  11. "A_CAT",
  12. "A_HORSE"
  13. ],
  14. "code": "C/C++"
  15. }
  16. ]
  17. }
  18. }


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

  1. .[0].ressummary * .[1]


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

  1. {
  2. "value": 1,
  3. "expect": 0,
  4. "tool": "abc",
  5. "Check": [
  6. {
  7. "Check": [
  8. "A_DOG",
  9. "A_CAT",
  10. "A_HORSE"
  11. ],
  12. "code": "C/C++"
  13. }
  14. ]
  15. }


这应该放在ressummary下:

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


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

  1. {
  2. "ressummary": {
  3. "value": 1,
  4. "expect": 0,
  5. "tool": "abc",
  6. "Check": [
  7. {
  8. "Check": [
  9. "A_DOG",
  10. "A_CAT",
  11. "A_HORSE"
  12. ],
  13. "code": "C/C++"
  14. }
  15. ]
  16. }
  17. }


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

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


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

  1. [
  2. {
  3. "resstart": 1700839261,
  4. "resend": 1700839965,
  5. "resop": "SUCCESS",
  6. "resurl": "http://xxxx/",
  7. "ressummary": {
  8. "value": 1,
  9. "expect": 0,
  10. "tool": "abc"
  11. }
  12. },
  13. {
  14. "Check": [
  15. {
  16. "Check": [
  17. "A_DOG",
  18. "A_CAT",
  19. "A_HORSE"
  20. ],
  21. "code": "C/C++"
  22. }
  23. ]
  24. }
  25. ]


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

展开查看全部
2j4z5cfb

2j4z5cfb3#

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

  1. #!/bin/bash
  2. # The name of your JSON file
  3. name="key.json"
  4. # The array of items for the "Check" key
  5. ccheck=("A_DOG" "A_CAT" "A_MOUSE" "A_HORSE")
  6. # Convert array to a JSON array of strings
  7. json_array=$(printf '%s\n' "${ccheck[@]}" | jq -R . | jq -s .)
  8. # Use jq to add the new "Check" section under "ressummary"
  9. jq --argjson arr "$json_array" \
  10. '.ressummary.Check = [{"Check": $arr | join(","), "code": "C/C++"}]' \
  11. "$name" > temp.json && mv temp.json "$name"
  12. # Display the updated JSON
  13. 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文件中。

展开查看全部

相关问题