# -*- coding: utf-8 -*- """商品详情双跑对比:PHP 线上响应 vs Java 本地响应,递归逐字段 diff""" import json import sys from _root import ROOT GOLDEN = str(ROOT / "golden/store_goods_detail.json") def load_java(path): with open(path, encoding="utf-8") as f: return json.load(f) def diff(a, b, path="", out=None): if out is None: out = [] if type(a) != type(b): # int/bool 等类型差异单独标注 out.append(f"{path}: 类型不同 PHP={type(a).__name__}({a!r}) JAVA={type(b).__name__}({b!r})") return out if isinstance(a, dict): for k in sorted(set(a) | set(b)): if k not in a: out.append(f"{path}.{k}: Java 多出 {b[k]!r}"[:200]) elif k not in b: out.append(f"{path}.{k}: Java 缺失(PHP={str(a[k])[:80]!r})") else: diff(a[k], b[k], f"{path}.{k}", out) elif isinstance(a, list): if len(a) != len(b): out.append(f"{path}: 数组长度 PHP={len(a)} JAVA={len(b)}") for i in range(min(len(a), len(b))): diff(a[i], b[i], f"{path}[{i}]", out) else: if a != b: out.append(f"{path}: PHP={a!r} JAVA={b!r}") return out if __name__ == "__main__": php = json.load(open(GOLDEN, encoding="utf-8")) java = load_java(sys.argv[1]) diffs = diff(php, java, "$") print(f"差异条数: {len(diffs)}") for d in diffs[:40]: print(" -", d)