Bash:如何从多行字符串构建 JSON

Bash:如何从多行字符串构建 JSON

我的awk输出是多行字符串。

awkresult=`awk '{...}'`
echo "{ \"result\": \"$awkresult\" }" > result.json

多行必须保留在结果字符串中。

我认为最好的方法是在每行末尾插入换行符awkresult

我的awk脚本无法修改。我应该如何修改我的代码?

答案1

请注意,值中的换行符必须按照 JSON 进行编码\n。 JSON 解析器会将这些解码为真正的换行符。插入一个文字JSON 文件中值中的换行符会导致 JSON 文档损坏。

使用jo(在 shell 中生成 JSON 输出的工具,具有正确的编码等):

awkresult='some string
with newlines
the end'

jo result="$awkresult"

这将导致输出

{"result":"some string\nwith newlines\nthe end"}

漂亮的打印:

jo -p result="$awkresult"

这导致

{
   "result": "some string\nwith newlines\nthe end"
}

将输出重定向jo到文件以保存输出,例如

jo result="$awkresult" >result.json

答案2

您可以使用此处文档,如下所示:

echo "$(cat <<EOM
{ "result" : "$awkresult" }
EOM
)" > result.json

请注意 echo 语句中的双引号 " ,它保留所有换行符,并且您不必转义其中的 \" 引号。

答案3

您的想法是正确的,但不要使用双引号来编码 JSON 字符串。在 周围使用单引号{..},使用特殊的引号序列来展开awkresult单引号内部

awkresult='foo\nbar\nzoo\n'

现在,使用变量作为

echo '{ "result": "'"$awkresult"'" }' > result.json

另请记住,JSON 规范“不允许”嵌入文字换行控制字符。您可以验证 JSON 片段是否有效

echo '{ "result": "'"$awkresult"'" }' | jq .
{
  "result": "foo\nboo\nbar\n"
}

答案4

您已经发布的代码将在以下位置保留换行符$awkresult

$ awkresult='foo
bar'
$ echo "{ \"result\": \"$awkresult\" }"
{ "result": "foo
bar" }

但这里有一个更简单、更强大、更便携的方法来做到这一点:

awkresult="$(awk '{...}')"
printf '{ "result": "%s" }\n' "$awkresult" > result.jso

或者你的意思是你必须用\n这样的字符串替换换行符

$ printf '{ "result": "%q" }\n' "$awkresult"
{ "result": "$'foo\nbar'" }

或者是其他东西?

相关内容