一、JSON 转义规则理解偏差(核心问题)
现象分析:
当通过 response.json()
解析数据时,Python 会自动将 JSON 中的 \n
转义为真实的换行符。但若服务器返回的是 双重转义字符 \\n
(即实际内容为 "reason": "line1\\nline2"
),你的替换逻辑才会生效。
验证方法:
在替换操作前添加调试输出,观察原始内容:
data = response.json()
# 调试:打印原始 reason 内容
print("原始 reason 内容:", repr(data["contradiction_details"][0]["reason"]))
可能结果及对策:
输出示例 | 含义 | 解决方案 |
---|---|---|
'line1\nline2' |
真实换行符,无需处理 | 删除替换逻辑 |
'line1\\nline2' |
双重转义,需要处理 | 保持现有代码 |
'line1\\\\nline2' |
三重转义(罕见) | 使用 .replace('\\\\n','\n') |
二、数据结构访问错误
常见问题:
若 contradiction_details
字段存在嵌套结构或不存在时,循环不会执行:
# 检查 contradiction_details 是否存在且为列表
print("contradiction_details 结构:", type(data.get("contradiction_details")))
解决方案:
增加安全访问逻辑:
for detail in data.get("contradiction_details", []):
if "reason" in detail:
detail["reason"] = detail["reason"].replace(r"\n", "\n")
三、JSON 序列化二次转义
关键机制:
json.dumps()
在序列化时会将换行符重新转义为 \n
,导致输出仍显示 \n
。
验证方法:
在最终输出前直接打印处理后的字符串:
# 替换后直接打印内容(绕过 json.dumps)
print("处理后的 reason 内容:")
print(data["contradiction_details"][0]["reason"])
若此时显示正确格式 → 说明需要改用其他输出方式。
四、终极解决方案
根据不同的场景需求,选择以下方法:
方案 1:保持 JSON 结构 + 保留换行符(适合程序间交互)
# 修改 dumps 参数防止二次转义
print(json.dumps(data, indent=2, ensure_ascii=False, separators=(',', ': ')))
方案 2:直接输出美化文本(适合人工阅读)
# 跳过 JSON 序列化,直接格式化输出
from pprint import pprint
for detail in data.get("contradiction_details", []):
print("\n=== Contradiction Detail ===")
print(detail.get("reason", ""))
print("Sources:", detail.get("sources", []))
方案 3:混合输出模式(推荐)
# 保持 JSON 结构的同时手动控制换行符
formatted_json = json.dumps(data, indent=2, ensure_ascii=False)
formatted_json = formatted_json.replace(r'\n', '\n') # 强制替换转义符
print(formatted_json)
五、服务端调试建议
如果问题仍未解决,建议直接查看 API 原始响应:
# 在 response.json() 前打印原始文本
print("原始响应文本:", response.text)
观察响应中 reason
字段的真实内容格式(重点关注 \n
的转义层级)。
通过以上步骤排查,你应能准确定位问题根源。根据我的经验,80% 的情况属于 第一类问题(自动转义已处理),15% 属于 第三类问题(二次转义),剩余 5% 是数据结构访问错误。