如何在Bash中将字符串列表转换为JSON字符串数组?

9

如何在Bash中将包含换行符的字符串列表变量转换为数组?

groups="group_1
group_2
group_3"

转换成 JSON 字符串数组:

{
    [ "group_1", "group_2", "group 3" ]
}

这可以用 jq 实现吗?
1个回答

17
如果你的jq具有inputs,那么最简单的方法可能是使用它:

如果您的 jq 具有 inputs,那么最简单的方法可能就是使用它:

jq -ncR '[inputs]' <<< "$groups"
["group1","group2","group3"]

否则,这里有三个替代方案:

jq -c -n --arg groups "$groups" '$groups | split("\n")' 

echo -n "$groups" | jq -cRs 'split("\n")'

echo "$groups" | jq -R -s -c 'split("\n") | map(select(length>0))'

无论如何,可以轻松地将该数组合并到 JSON 对象中,例如通过扩展过滤器使用 | {groups: .}

如果您真的想生成无效的 JSON,请考虑:

printf "%s" "$groups" | jq -Rrsc 'split("\n") | "{ \(.) }"'

输出:

{ ["group_1","group_2","group_3"] }

关于select(length>0)的注意事项

考虑以下情况:

 jq -Rsc 'split("\n")' <<< $'a\nb'
 ["a","b",""]

包含 select(length>0) 的原因是为了避免末尾的空字符串。

如果 $groups 包含连续的换行符,并且保留空字符串很重要,那么您可能想使用 [:-1],例如:

jq -cRs 'split("\n")[:-1]' <<< "$groups"
["group1","group2","group3"]

如果您的jq不支持[:-1],请将0显式写出:[0:-1]


考虑到即使没有 [:-1],内部行也不会报告其结尾的\n,而且奇怪的是,[:-1] 没有从末尾删除一个附加的字符。通常,split() 应用的是“分隔符”逻辑而不是“终止符”逻辑,因此它能够抑制报告最后的 \n 作为一个“额外”的数组元素这一事实令人惊讶。 - mklement0
1
由于这主要是一个 jq 问题,我建议使用 printf '%s' "$groups" 而不是 echo -n;然后你可以在任何 shell 中使用更短的 jq 过滤器,而不必担心 echo 如何解释 -n "选项"。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接