使用 JQ 和 bash 处理 JSON,包含换行符

使用 JQ 和 bash 处理 JSON,包含换行符

我收到一个带有类似于以下内容的curl 调用的 JSON:

output="$(curl -s "$api_url")"

此输出为 JSON 格式,必须由 jq 处理,如下所示:

{
    "test": "Hello\nThere!"
}

现在,我正在使用以下echo管道组合来使 jq 工作:

test="$(echo "$output" | jq -r ".test")"

但是,这对于示例输入不起作用,因为它在 JSON 和 JQ 错误中包含新行parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 2, column 6

有什么方法可以改变数据以便 jq 可以理解它吗?

答案1

所以文字输入是这样的:

$ output='{
>     "test": "Hello
> There!"
> }'
$ echo "$output" | jq -r ".test"
parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 3, column 7

JSON没有多行字符串。因此,如果您从 API 获取这个字面值,那么它是API错误,并且应该固定在服务器端。


既然你说 API 实际上返回了类似的内容,那么{"test": "Hello\nThere!"}问题一定出在你的命令上,因为这适用于 Bash 4.4.23 中的 jq 1.5:

$ output='{"test": "Hello\nThere!"}'
$ echo "$output" | jq -r ".test"
Hello
There!

eval(这是邪恶的),echo -e其他特殊命令可能会导致转义字符被解码。尝试使用printf '%s' "$output"替代。调试此问题需要有关您的环境的更多信息。

相关内容