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

使用difflib.unified_diff生成JSON Diff结果异常问题排查

解决difflib.unified_diff对比JSON时输出不符合预期的问题

你现在遇到的问题根源在于:difflib.unified_diff默认会把传入的字符串当成字符序列来逐字符对比,而不是按你期望的JSON行结构或者键值对来做差异分析。直接传整个单行JSON字符串进去,它自然会输出字符层面的杂乱差异,和你想要的行级差异完全不符。

要得到清晰易读的JSON差异,我们需要先把JSON格式化成标准的多行结构,再让unified_diff按行对比。这里有个可靠的实现方案:

from difflib import unified_diff
import sys
import json

# 原始JSON字符串
sone = """ { "one": 1, "a": "A", "b": "B" } """
stwo = """ { "two": 2, "a": "A", "b": "B" } """

# 解析为字典后,格式化成带缩进的多行JSON(保证结构一致)
one_formatted = json.dumps(json.loads(sone), indent=2) + '\n'
two_formatted = json.dumps(json.loads(stwo), indent=2) + '\n'

# 按行拆分后传入unified_diff,实现行级对比
for line in unified_diff(
    one_formatted.splitlines(), 
    two_formatted.splitlines(), 
    fromfile="one", 
    tofile="two", 
    lineterm=''
):
    sys.stdout.write(line + '\n')

这段代码做了两件关键的事:

  • 标准化JSON格式:用json.loads解析字符串为字典,再用json.dumps加indent=2生成结构统一的多行JSON,确保每个键值对单独占一行,结构清晰。
  • 按行对比:用splitlines()把格式化后的字符串拆分成行列表,让unified_diff基于行来计算差异,输出的结果就和你预期的一致了。

运行这段代码后,你会得到类似这样的输出:

--- one
+++ two
@@ -1,6 +1,6 @@
 {
-  "one": 1,
   "a": "A",
   "b": "B"
+  "two": 2
 }

如果你不想解析JSON(比如原始字符串有特殊格式不能解析),也可以手动把单行JSON拆分成多行,但解析后格式化的方式能最大程度保证JSON结构的一致性,避免因手动换行导致的对比误差。

内容的提问来源于stack exchange,提问作者kanna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:05