Python格式化JSON输出方法

一、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% 是数据结构访问错误。