| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- # -*- 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)
|