如何用JavaScript实现JSON-LD对Schema.org的自托管式验证?
自托管JavaScript实现JSON-LD(Schema.org)合规性验证
核心实现逻辑
要实现类似官方验证器的功能,核心是加载Schema.org的词汇表定义,然后对JSON-LD对象做结构、属性及值类型的校验。
可行方案及步骤
1. 基于Schema.org词汇表库实现
直接依赖预构建的Schema.org结构化数据,通过npm包schemaorg获取类型与属性规则:
- 安装依赖:
npm install schemaorg - 加载Schema数据,提取目标
@type对应的属性规则(包括必填项、值类型约束等) - 编写校验逻辑:
- 检查JSON-LD是否包含
@context且指向Schema.org(如"@context": "https://schema.org") - 验证
@type是否为Schema.org中存在的合法类型 - 遍历对象属性,确认每个属性属于该类型的允许范围,且值类型符合定义(比如
name必须是字符串,offers需为Offer类型数组)
- 检查JSON-LD是否包含
2. 通过JSON Schema间接校验
将Schema.org类型转换为JSON Schema格式,利用成熟的JSON Schema校验库(如ajv)完成验证:
- 安装依赖:
npm install ajv schema-to-json-schema - 把目标Schema.org类型(比如
Product)转换为JSON Schema - 使用
ajv加载生成的JSON Schema,对JSON-LD对象执行校验 - 注意处理JSON-LD的
@context映射,确保属性名与Schema定义匹配
3. 轻量自定义校验(适合简单场景)
如果不需要完整覆盖所有Schema规则,可针对常用类型编写自定义校验函数:
function validateSchemaOrgJsonLd(jsonLd) { // 基础校验:@context和@type必须存在 if (!jsonLd['@context'] || jsonLd['@context'] !== 'https://schema.org') { return { valid: false, errors: ['缺少合法的Schema.org @context'] }; } if (!jsonLd['@type']) { return { valid: false, errors: ['缺少@type字段'] }; } // 示例:校验Product类型的必填属性与值类型 if (jsonLd['@type'] === 'Product') { const requiredProps = ['name']; const missingProps = requiredProps.filter(prop => !jsonLd[prop]); if (missingProps.length > 0) { return { valid: false, errors: [`Product类型缺少必填属性:${missingProps.join(', ')}`] }; } if (typeof jsonLd.name !== 'string') { return { valid: false, errors: ['Product的name属性必须是字符串类型'] }; } } return { valid: true, errors: [] }; }
注意事项
- Schema.org词汇表会持续更新,需定期同步最新的类型定义
- 处理嵌套类型(如
Product下的offers是Offer数组)时,要实现递归校验逻辑 - 支持
@type为数组的多类型场景,需同时校验所有类型的规则
内容的提问来源于stack exchange,提问作者four43
相关产品推荐
相关产品推荐

