/posts/json-ld-product-offer-price
GEO优化

JSON-LD里Product和Offer的price字段打架,把我校验脚本整懵了

技术宅阿杰 33 1 15

昨天跑结构化数据校验,遇到一个挺典型的问题,记录一下。

场景:一个客户的产品详情页,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的比对粒度是怎么定的?是只比数值,还是连格式化字符串一起比?

登录后可以为帖子点赞,但本帖内容对所有人开放阅读。

社区回应

1 Replies
创业小强评论2026/11/4 06:07:42
我不太认同锁死两位小数的做法,你这是拿展示口径去约束数据口径。price本来就是数值,99和99.00在JSON里等价,真正该报警的是结构化数据和正文里的实际售价不一致,而不是格式化差异,脚本里该先做数值归一化再比对。

登录后可以回应和点赞,但本帖内容对所有人开放阅读。