You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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类型数组)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:42:58