API返回含多行及转义字符的JSON,jq解析错误求助
问题描述
调用API获取的JSON包含多行内容及未转义的控制字符,尝试用以下命令同时输出完整JSON并提取generated_message_id字段,但始终遭遇解析错误:
response=$(curl -s -X 'POST' \ ".../api/generated_message/action/generate" \ -H 'accept: application/json' | jq -r .) echo $response generated_message_id=$(echo $response | jq -r '.generated_message_id')
错误信息:
parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 17, column 96
解决方案
1. 错误根源
API返回的JSON存在未按规范转义的控制字符(如换行、制表符等U+0000至U+001F范围内的字符),且直接将响应存入变量后用echo输出会破坏JSON结构,导致jq二次解析失败。
2. 修复步骤
方法一:保存原始响应并修复解析
先将API响应保存到文件,避免字符丢失或破坏,再用jq修复控制字符并处理:
# 保存原始API响应 curl -s -X POST ".../api/generated_message/action/generate" -H 'accept: application/json' > raw_response.json # 修复JSON中的控制字符,输出格式化后的完整JSON jq -R 'gsub("[\\u0000-\\u001F]"; "\\\\u00" + (. | ord | tostring | lpad(2; "0"))) | fromjson' raw_response.json > fixed_response.json cat fixed_response.json # 提取目标字段 generated_message_id=$(jq -r '.generated_message_id' fixed_response.json) echo "提取的generated_message_id:$generated_message_id"
方法二:一步完成(无中间文件)
利用tee命令同时输出修复后的JSON并提取字段:
# 发起请求,同时输出修复后的完整JSON并提取ID curl -s -X POST ".../api/generated_message/action/generate" -H 'accept: application/json' | \ tee >(jq -R 'gsub("[\\u0000-\\u001F]"; "\\\\u00" + (. | ord | tostring | lpad(2; "0"))) | fromjson' >&1) | \ jq -R 'gsub("[\\u0000-\\u001F]"; "\\\\u00" + (. | ord | tostring | lpad(2; "0"))) | fromjson | .generated_message_id' -r > generated_id.txt generated_message_id=$(cat generated_id.txt) echo "提取的generated_message_id:$generated_message_id"
3. 关键说明
jq -R:以原始字符串模式读取输入,避免提前解析错误的JSONgsub(...):将所有未转义的控制字符替换为符合JSON规范的转义格式(如\n转为\\n)fromjson:将修复后的字符串转为合法的JSON对象,供后续处理
内容的提问来源于stack exchange,提问作者Александр М
相关产品推荐
相关产品推荐

