我收到一个带有类似于以下内容的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"
替代。调试此问题需要有关您的环境的更多信息。