jq将bash数组转换为json数组并插入到文件中

6 arrays bash json edit jq

给定一个bash数组,如何将其转换为JSON数组以便输出到带有jq的文件?

另外:有没有办法保持server_nohup数组不变,而不是每次都重写整个json文件?

newArray=(100 200 300)
jq -n --arg newArray $newArray '{
    client_nohup: [ 
        $newArray
    ],
    server_nohup: [

    ]
}' > $projectDir/.watch.json
Run Code Online (Sandbox Code Playgroud)

当前输出:

{
"client_nohup": [
    "100"
],
"server_nohup": []
}
Run Code Online (Sandbox Code Playgroud)

期望的输出:

{
"client_nohup": [
    100,
    200,
    300
],
"server_nohup": []
}
Run Code Online (Sandbox Code Playgroud)

pea*_*eak 5

(1) 如果 newArray 中的所有值都作为没有空格的 JSON 值有效,那么您可以将值作为流进行管道传输,例如

newArray=(100 200 300)
echo "${newArray[@]}" |
  jq -s '{client_nohup: ., server_nohup: []}'
Run Code Online (Sandbox Code Playgroud)

(2) 现在假设您只想更新文件中的“nohup”对象,比如 nohup.json:

{ "client_nohup": [], "server_nohup": [ "keep me" ] }
Run Code Online (Sandbox Code Playgroud)

由于您使用的是 bash,因此您可以编写:

echo "${newArray[@]}" |
  jq -s --argjson nohup "$(cat nohup.json)" '
    . as $newArray | $nohup | .client_nohup = $newArray
  '
Run Code Online (Sandbox Code Playgroud)

输出

(1)

{
  "client_nohup": [
    100,
    200,
    300
   ],
  "server_nohup": []
}
Run Code Online (Sandbox Code Playgroud)

(2)

{
  "client_nohup": [
    100,
    200,
    300
  ],
  "server_nohup": [
    "keep me"
  ]
}
Run Code Online (Sandbox Code Playgroud)

其他情况

哪里有意愿,哪里就有 jq 方式 :-)

例如,参见How to format a bash array as a JSON array 中接受的答案(尽管这不是一个完全通用的解决方案)。

有关通用解决方案,请参阅: How can a variable number of arguments be passed to jq? How can a bash array of values be passed in to jq as a single argument?jq 常见问题解答https://github.com/stedolan/jq/wiki/FAQ

通用解决方案

需要明确的是,如果已知数组值是有效的 JSON,那么有几个不错的选择;如果数组值是任意的 bash 字符串,那么使用 jq 处理它们的唯一有效、通用的方法是使用-Rjq 选项(例如与 -s 结合使用),但是(bash)字符串将全部作为 JSON 读入字符串,因此任何预期的类型信息都将丢失。(这里的要点取决于 bash 字符串不能包含 NUL 字符的技术性。)

通常,为了减轻后一种顾虑,可以将数字字符串转换为 JSON 数字,例如使用 jq 成语:(tonumber? // .)