compare_detail.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # -*- coding: utf-8 -*-
  2. """商品详情双跑对比:PHP 线上响应 vs Java 本地响应,递归逐字段 diff"""
  3. import json
  4. import sys
  5. GOLDEN = r"C:\Users\Administrator\WorkBuddy\2026-10-17-12-27-10\java-rewrite\golden\store_goods_detail.json"
  6. def load_java(path):
  7. with open(path, encoding="utf-8") as f:
  8. return json.load(f)
  9. def diff(a, b, path="", out=None):
  10. if out is None:
  11. out = []
  12. if type(a) != type(b):
  13. # int/bool 等类型差异单独标注
  14. out.append(f"{path}: 类型不同 PHP={type(a).__name__}({a!r}) JAVA={type(b).__name__}({b!r})")
  15. return out
  16. if isinstance(a, dict):
  17. for k in sorted(set(a) | set(b)):
  18. if k not in a:
  19. out.append(f"{path}.{k}: Java 多出 {b[k]!r}"[:200])
  20. elif k not in b:
  21. out.append(f"{path}.{k}: Java 缺失(PHP={str(a[k])[:80]!r})")
  22. else:
  23. diff(a[k], b[k], f"{path}.{k}", out)
  24. elif isinstance(a, list):
  25. if len(a) != len(b):
  26. out.append(f"{path}: 数组长度 PHP={len(a)} JAVA={len(b)}")
  27. for i in range(min(len(a), len(b))):
  28. diff(a[i], b[i], f"{path}[{i}]", out)
  29. else:
  30. if a != b:
  31. out.append(f"{path}: PHP={a!r} JAVA={b!r}")
  32. return out
  33. if __name__ == "__main__":
  34. php = json.load(open(GOLDEN, encoding="utf-8"))
  35. java = load_java(sys.argv[1])
  36. diffs = diff(php, java, "$")
  37. print(f"差异条数: {len(diffs)}")
  38. for d in diffs[:40]:
  39. print(" -", d)