【问题标题】:How to convert string list to JSON string array in Bash?如何在 Bash 中将字符串列表转换为 JSON 字符串数组?
【发布时间】:2017-11-12 15:40:39
【问题描述】:

如何将 Bash 中的变量转换为包含换行符的字符串列表,像这样

groups="group_1
group_2
group_3"

到 JSON 字符串数组:

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

jq 可以吗?

【问题讨论】:

    标签: arrays json string bash jq


    【解决方案1】:

    如果你的 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&gt;0) 的原因是为了避免尾随“”。

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

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

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

    【讨论】:

    • [:-1] 用于抑制将尾随 \n 报告为 附加 数组元素的事实令人惊讶,因为即使没有它,也会报告内部行 没有他们尾随的\n,而且,奇怪的是,[:-1] 并没有从末尾修剪一个附加字符。通常,split() 使用 separator 逻辑而不是 terminator 逻辑。
    • 因为这主要是一个jq 问题,我建议使用printf '%s' "$groups" 而不是echo -n;那么你可以在任何 shell 中使用较短的jq 过滤器,而不必担心echo 将如何解释-n“选项”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多