Back

JSON-LD 如何帮助 AI 理解您的网站

JSON-LD 如何帮助 AI 理解您的网站

JSON-LD 是一种基于 <script> 标签的格式,用于将 Schema.org 词汇表作为结构化、机器可读的元数据嵌入 HTML 中。它使搜索引擎和 AI 系统能够识别实体——文章、组织、产品、面包屑导航、人物——而无需从正文中推断。对于 Google Search 而言,正确的 JSON-LD 可使页面符合特定搜索功能的条件,并有助于填充知识图谱。对于 GPTBot、ClaudeBot 和 PerplexityBot 等 AI 爬虫而言,有一个前端开发者普遍忽视的硬性限制:这些爬虫不执行 JavaScript,因此 JSON-LD 必须存在于服务器响应中,才能被它们读取。

本文将介绍 JSON-LD 的实际作用、适用场景与局限性、三个可直接参考的示例、导致客户端注入标记对 AI 爬虫失效的渲染差距,以及如何验证您所发布的内容。

核心要点

  • JSON-LD 是 Google 推荐的结构化数据格式,使用 Schema.org 词汇表以机器可读的形式描述实体及其关系。
  • 包括 GPTBot、ClaudeBot 和 PerplexityBot 在内的 AI 爬虫不执行 JavaScript——通过 useEffect、Google Tag Manager 或任何客户端路径注入的 JSON-LD 对它们而言是不可见的。
  • AI Overviews 和 AI Mode 不需要特定的 AI 标记;适用标准 Google Search 的资格条件,结构化数据有助于内容解读,但不保证被收录。
  • Google 已于 2026 年 5 月停止在搜索结果中展示 FAQ 富媒体摘要,Search Console 和 Rich Results Test 的相关支持将于 2026 年 6 月移除;FAQPage 仍是有效的 Schema.org 类型,但已不再是获取富媒体摘要的有效策略。
  • 从长期验证的角度来看,validator.schema.org 是更稳妥的默认选择——它可检查完整的 Schema.org 词汇表,而 Google Rich Results Test 仅涵盖 Google 支持的功能。

JSON-LD 是什么,为何存在

JSON-LD(JavaScript Object Notation for Linked Data,关联数据的 JSON 表示法)是 W3C 标准化的语法,用于以 JSON 格式表达关联数据。在 Web 领域,它几乎总是用于在文档的 <script type="application/ld+json"> 标签中嵌入 Schema.org 词汇表。这些数据描述页面的实体——页面内容是什么、由谁撰写、哪个组织发布、与其他页面的关联关系——以解析器可直接消费的形式呈现,无需读取正文。

引入 JSON-LD 的原因在于降低解读成本。如果没有结构化数据,爬虫就必须推断页面上的”Apple”指的是公司还是水果;署名”Jane Chen”是作者还是文章主题;标记中的价格属于页面上的产品还是侧边栏中的相关商品。Schema.org 为这些事实提供了明确的类型和属性。JSON-LD 将它们以独立于可见 DOM 的块形式传递,这正是 Google 推荐它优于 Microdata 和 RDFa 的原因——您可以在不修改布局的情况下生成和更新结构化数据。

有几点需要明确说明:JSON-LD 并非 Google 文档化排名系统中已确认的排名因素。它不保证富媒体摘要——符合资格是必要条件,但并非充分条件。它不保证被收录进 AI Overviews 或 AI Mode。AI 系统也不要求使用 JSON-LD,它们同样可以读取正文。JSON-LD 的作用在于减少推断工作量,从而提高正确解读的可能性,降低模糊内容被错误分类的风险。

JSON-LD 与 AI Overviews 及 AI Mode 的关系

AI Overviews 和 AI Mode 建立在 Google 现有搜索索引之上。Google 的官方指导明确表示,不存在专门针对 AI 的标记——页面通过与常规搜索相同的内容和结构化数据信号获得 AI 功能的资格。如果您的页面已被正确索引、结构合理,并与用户意图匹配,那么您为 Search 发布的结构化数据就是这些功能所依赖的数据。

客观来说:结构化数据有助于 AI 系统正确解读您的内容,但不能保证被纳入生成式答案。应将其视为消除歧义的手段,而非增长杠杆。

AI 爬虫的渲染差距

这是前端开发者最需要关注的技术要点,却在大多数 JSON-LD 相关文章中被忽视:AI 爬虫通常应被视为非渲染爬虫,因此结构化数据必须存在于初始 HTML 响应中。

Googlebot 是个例外:它通常会在延迟处理阶段渲染 JavaScript,因此客户端注入的 JSON-LD 最终会被 Search 处理。但 AI 爬虫不会等待。如果您的 JSON-LD 只在水合(hydration)之后才存在,它对目前读者最常询问的那些系统而言是不可见的。

在实际前端应用中,一种常见的生产故障模式是:开发者在 useEffect 钩子中添加 JSON-LD,或通过 Google Tag Manager 推送。该块出现在渲染后的 DOM 中,Rich Results Test(会执行渲染)显示其有效,团队便认为大功告成。然而与此同时,所有非渲染爬虫看到的 HTML 响应中根本没有任何结构化数据。

解决方法是将 <script type="application/ld+json"> 块放入初始服务器响应中。

按框架进行 JSON-LD 服务端渲染

框架JSON-LD 的放置位置
Next.js App Router在 Server Component 中内联 <script type="application/ld+json">,或使用 Metadata APIother 字段
Next.js Pages Routernext/head<Head> 中内联 <script>,通过 getServerSideProps/getStaticProps 路径渲染
Nuxt 3在服务端上下文中调用 useHead,传入 script 条目
Astro直接在 .astro 模板中内联 <script type="application/ld+json">(默认静态,无需 JS 执行)
SvelteKit<svelte:head> 块中包含脚本,由服务端渲染

各技术栈的原则相同:JSON-LD 块必须存在于服务器返回的字节中,而不是浏览器在首次渲染后添加的字节中。

三个可用的 JSON-LD 示例

以下示例使用 2026 年 3 月 19 日发布的 Schema.org 30.0 版本词汇表。

BlogPosting(Article 的子类型)

在 Schema.org 层级中,BlogPostingArticle 的子类型,而 Article 本身又是 CreativeWork 的子类型。声明 "@type": "BlogPosting" 会隐式继承所有 Article 属性,无需同时声明两者。

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "@id": "https://openreplay.com/blog/json-ld-ai-search#article",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://openreplay.com/blog/json-ld-ai-search"
  },
  "headline": "How JSON-LD Helps AI Understand Your Website",
  "description": "A frontend-focused guide to JSON-LD, Schema.org, and the server-rendering requirement for AI crawlers.",
  "image": "https://openreplay.com/images/blog/json-ld-ai-search.png",
  "datePublished": "2026-05-20T09:00:00-04:00",
  "dateModified": "2026-05-20T09:00:00-04:00",
  "author": {
    "@type": "Organization",
    "name": "OpenReplay Team",
    "url": "https://openreplay.com"
  },
  "publisher": {
    "@id": "https://openreplay.com/#organization"
  }
}
</script>

在长篇文章页面上使用此标记。mainEntityOfPage 将文章与其规范 URL 关联;dateModified 很重要,因为当时效性是查询信号时,Google 会使用该字段。

Organization

Organization 类型描述发布实体。使用 sameAs 指向规范的外部资料页——这是系统将您的品牌与同名其他实体区分开来的方式。

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://openreplay.com/#organization",
  "name": "OpenReplay",
  "url": "https://openreplay.com",
  "logo": {
    "@type": "ImageObject",
    "url": "https://openreplay.com/images/logo.png",
    "width": 512,
    "height": 512
  },
  "sameAs": [
    "https://github.com/openreplay",
    "https://www.linkedin.com/company/openreplay",
    "https://x.com/OpenReplayHQ"
  ]
}
</script>

在全站范围内部署一次——通常放在每个页面的文档 <head> 中。在其他 schema 块中复用该 @id(如上方 BlogPosting.publisher 所示),使单一规范的 Organization 定义在各处被引用,而非重复声明。

BreadcrumbList 描述页面在网站层级中的位置。Google 支持面包屑富媒体摘要,同样的数据也有助于 AI 系统理解网站结构。

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://openreplay.com/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Blog",
      "item": "https://openreplay.com/blog"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "How JSON-LD Helps AI Understand Your Website"
    }
  ]
}
</script>

最后一项省略了 item,因为它就是当前页面。position 从 1 开始计数。

保持结构化数据与可见内容一致

Google 的结构化数据指南明确规定:JSON-LD 中的内容必须与页面上显示的内容相符。标记页面上不存在的评论、未显示的价格,或与可见署名相矛盾的作者姓名,都存在被手动处罚的风险。结构化数据应当描述页面内容,而不是用 DOM 中未经证实的声明来”增强”页面。

这对 AI 系统同样重要。如果您的可见正文与 JSON-LD 内容相互矛盾,您制造的正是结构化数据本应消除的那种歧义。

发布前进行验证

以下两个工具可覆盖完整的验证工作流:

工具检查内容最适用场景
Google Rich Results TestGoogle 支持的富媒体摘要类型的资格验证Article、Product、Breadcrumb 等类型的部署前检查
Schema Markup Validator对完整 Schema.org 词汇表的符合性检查通用验证;适用于 Google 不作为富媒体摘要展示的任何类型

Rich Results Test 会渲染页面(因此能看到 AI 爬虫看不到的客户端注入 JSON-LD)。要确认非渲染爬虫实际看到的内容,可对您的 URL 运行 curl -A "GPTBot" https://your-page,并在响应中搜索 application/ld+json。如果该块不在原始 HTML 中,AI 爬虫就不会看到它。

Google Search Console 的”增强功能”部分会报告解析错误以及 Google 跟踪的结构化数据类型的资格状态。将其用于持续监控,而非部署前验证的替代工具。

关于 FAQPage 的说明

FAQPage 仍是有效的 Schema.org 类型,Google 仍将其用于内容理解。但 Google 在其 FAQPage 文档中指出,FAQ 相关的 Search 功能正在被移除:FAQ 富媒体摘要已于 2026 年 5 月停止在搜索结果中展示;Search Console 报告和 Rich Results Test 支持将于 2026 年 6 月移除;Search Console API 支持将于 2026 年 8 月随之停用。如果您现在选择实施 schema 以获取可见的富媒体摘要效果,FAQPage 并非合适的选择。如果您确实有 FAQ 页面并希望在语义层面留存记录,可以实施它——但不应将其作为抢占搜索结果版面的手段。

这也是 validator.schema.org 成为长期验证工作更稳妥默认选择的原因:它不依赖于 Google 选择以富媒体摘要形式展示哪些功能。

优先发布什么

如果您从零开始,最具价值的实施顺序是:在全站部署一个 Organization 块,在除首页外的每个页面添加 BreadcrumbList,在编辑内容上添加 Article/BlogPosting。所有内容均采用服务端渲染。使用两种工具进行验证。然后用非渲染 User-Agent 检查原始 HTML 响应,确认 AI 爬虫确实能接收到您编写的内容。

结构化数据本身不会推动排名提升,也不能让您的内容进入 AI Overviews。但它能做到的是——在正确发布的情况下,可靠地消除导致搜索引擎和 AI 系统误读内容的推断猜测。对于前端团队而言,最重要的工作不是选择添加哪些 schema 类型,而是确定它们在渲染管线中的位置。将 JSON-LD 放入服务器响应中,其余的交给内容本身。

常见问题

使用 JSON-LD。Google 明确推荐它优于 Microdata 和 RDFa,因为它存在于与可见 DOM 解耦的单一 script 块中,这意味着您可以在不修改布局标记的情况下生成和更新结构化数据。三种格式都能表达 Schema.org 词汇表,也都能被 Google 解析,但 JSON-LD 更易于维护、更易于服务端渲染,也是 Google 在其结构化数据文档中的示例所使用的格式。

可以。Google 支持单个页面上有多个独立的 script 标签,这是组合 Organization、BreadcrumbList 和 BlogPosting 等类型的标准模式。另一种方式是在单个 script 中使用 @graph 键包含一个图数组,每个实体拥有自己的 @id。两种方式均有效;当实体之间通过 @id 相互引用时,@graph 模式更为简洁,因为它为每个实体保留了单一的规范定义。

仅当 JSON-LD 存在于初始服务器响应中时有效。在水合后才注入结构化数据的 SPA,对 GPTBot、ClaudeBot 和 PerplexityBot 等非渲染爬虫而言是不可见的。解决方法是对需要结构化数据的页面采用服务端渲染或静态生成——使用 Next.js、Nuxt、Astro 或 SvelteKit 的 SSR 或 SSG 模式——确保 script 标签在任何 JavaScript 执行之前就存在于 HTML 字节中。

仅在文章实质性内容发生变化时更新 dateModified——包括更正、新增章节、更新事实、刷新示例。不要在每次部署时或进行错别字修正、样式调整等表面性编辑时更新它。Google 将 dateModified 作为时效性查询的新鲜度信号,在没有真实内容变化的情况下虚增该值,违反了结构化数据必须与可见内容相符的规定,存在被手动处罚的风险。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay