为了省事把请求体 json.dumps 成字符串再用正则替换手机号,脱敏后 json.loads 失败,字段顺序和数字类型全变,下游解析直接崩。
一开始怀疑是「只处理了顶层字段,嵌套结构没递归」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。字符串里的转义引号被正则破坏。也可能是数字被替换成占位符后类型从 number 变成 string。
另外,正则跨字段匹配,把相邻字段一起吃掉。
动手时先确认序列化后的字段类型
python -c "import json;d={'phone':'13800001111','age':30};print(json.dumps(d,ensure_ascii=False))"
随后改成递归遍历按类型替换
python -c "import json;d={'phone':'13800001111'};print({k:('***' if k=='phone' else v) for k,v in d.items()})"
再往下替换后再校验一次结构
python -c "import json;s='{\"phone\":\"***\"}';print(json.loads(s))"
等前面都确认过,再对比脱敏前后的字段数量与类型
python -c "print({'keys':2,'types':['str','int']})"
改完先别撤,确认这几项。脱敏后的 JSON 能正常解析,字段数量和类型与原文一致,手机号全部替换,下游服务无感。
这里还有个坑。脱敏要在结构化数据上做而不是在序列化后的字符串上做,正则一碰转义字符就会破坏结构。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
