JSON-LD里Product和Offer的price字段打架,把我校验脚本整懵了
昨天跑结构化数据校验,遇到一个挺典型的问题,记录一下。
场景:一个客户的产品详情页,JSON-LD里同时嵌了Product和Offer,Product的offers属性里给了price,页面正文又有价格展示。我的校验脚本逻辑很简单——提取JSON-LD里的price,和正文DOM里.price的textContent做比对,不一致就报警。
结果脚本报了个错,说Product.offers.price是99.00,但正文解析出来是99。差了个.00。
第一反应是正文DOM的解析问题,但细看发现不是——正文里的价格是¥99,没有小数位。而JSON-LD里写的是99.00。严格来说,这两个值在语义上等价,但字符串比对就是不通过。
这就引出一个字段口径的问题:price到底该以什么格式为准?Schema.org的文档里price是Number或Text,没强制要求小数位。但Google的富媒体搜索结果文档里,示例都是带小数位的。我翻了下客户的历史提交记录,发现他们之前一直写99,最近改成了99.00,但正文模板没同步。
我的处理方式:先锁口径——统一规定price字段必须保留两位小数,正文展示可以省略小数位,但校验脚本里加一层归一化:把两边都转成Decimal再比。这样既不影响用户看到的价格样式,也能保证结构化数据和正文逻辑一致。
但这里有个细节:如果正文里是99.00,JSON-LD里是99,归一化后也能过,但严格来说不符合“一字不差”的原则。我现在的做法是,归一化只用于容错,日常巡检还是会报出来,让人工确认是否要改模板。
另一个坑是priceCurrency。客户香港站和大陆站共用一个JSON-LD模板,结果priceCurrency写死成了HKD,大陆站页面也输出HKD,但正文显示的是¥。这个我的脚本没检出来,因为只比对了price数值,没比priceCurrency和正文货币符号的映射关系。后来补了个映射表:¥对应CNY,$对应USD,HK$对应HKD。
现在的问题是,这种货币符号和ISO代码的映射,在不同地区的页面模板里写法不统一。比如有的页面正文写RMB,有的写¥,有的写人民币。如果要做全量校验,得先把这个映射口径定死。
你们在做结构化数据校验的时候,price和priceCurrency的比对粒度是怎么定的?是只比数值,还是连格式化字符串一起比?
