先看现象。结构化数据校验时报 value must not be empty,但错误信息里没有指出是哪个字段,页面字段又很多,只能一个个试着排查。
真正麻烦的地方在于,几个原因的现象几乎一样。某个必填字段输出了空字符串。另一种情况是变量为空时仍然拼进了 JSON。
另外,数组里混入了 null 值。
第一件事是把 JSON 格式化看清结构
curl -s https://www.example.com/a/ | python -m json.tool
筛出所有空字符串字段
curl -s https://www.example.com/a/ | grep -n '"": ""'
末了在输出前过滤空值
echo json_encode(array_filter($schema));
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
怎么算真的好了,看的是同一批现象。所有字段都有实际值,校验通过,警告消失。
提醒一点。空字符串和 null 在解析器看来都是缺值,输出前统一过滤比逐个字段判断更可靠,尤其是循环生成的结构更容易漏,写完先打一遍格式化看结构。多语言翻译后字段变空也很常见。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。