You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:以原始字符串模式读取输入,避免提前解析错误的JSON
  • gsub(...):将所有未转义的控制字符替换为符合JSON规范的转义格式(如\n转为\\n)
  • fromjson:将修复后的字符串转为合法的JSON对象,供后续处理

内容的提问来源于stack exchange,提问作者Александр М

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:52:49