如果你正在运营一个内容网站或电商平台,但搜索结果中没有显示富摘要(Rich Results)——评分星级、价格区间、FAQ 折叠——那你可能正在损失 20-35% 的点击率。Google 的数据显示,带有富摘要的搜索结果比普通结果的 CTR 高出 30% 以上。而实现这一切的核心技术,就是 JSON-LD 结构化数据。
JSON-LD(JSON for Linked Data)是一种用 JSON 格式表达结构化数据的 W3C 标准,也是 Google、百度、Bing 等搜索引擎唯一推荐的结构化数据嵌入方式。它本质上是一种「给机器看的 JSON」——通过 @context 和 @type 声明语义,让爬虫不仅能看到你的数据,还能理解它代表什么。本文将从原理到生产实战,带你掌握 JSON-LD 的核心用法和进阶技巧。
🔍 一、JSON-LD 核心概念与语义模型
1.1 为什么选 JSON-LD 而不是 Microdata 或 RDFa?
结构化数据有三种主流嵌入方式:Microdata、RDFa 和 JSON-LD。它们的差异非常大:
| 特性 | JSON-LD | Microdata | RDFa |
|---|---|---|---|
| 语法形式 | 独立 <script> 块 |
HTML 标签属性 | HTML 标签属性 |
| 与 HTML 耦合度 | ✅ 完全解耦 | ❌ 紧耦合 | ❌ 紧耦合 |
| 动态生成 | ✅ 非常方便 | ❌ 需改 DOM | ❌ 需改 DOM |
| Google 支持度 | ✅ 首选推荐 | ⚠️ 支持 | ⚠️ 支持 |
| 维护成本 | ✅ 低 | ❌ 高 | ❌ 高 |
| 可测试性 | ✅ 独立验证 | ❌ 需渲染页面 | ❌ 需渲染页面 |
⚠️ **警告:**Google 官方明确表示推荐使用 JSON-LD,并且逐步减少对 Microdata/RDFa 的新功能支持。新项目请直接选择 JSON-LD。
JSON-LD 的最大优势是与 HTML 完全解耦。你可以在 <head> 中放一个 <script type="application/ld+json"> 块,不影响任何页面渲染逻辑。这对于 Vue、React 等 SPA 框架尤其友好——结构化数据可以通过 useHead() 或 dangerouslySetInnerHTML 动态注入,无需操作 DOM 属性。
1.2 JSON-LD 核心关键字解析
JSON-LD 的语义模型建立在几个核心关键字之上:
// 最小的 JSON-LD 结构:声明上下文和类型
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "JSON-LD 结构化数据实战",
"author": {
"@type": "Person",
"name": "张三"
}
}
每个关键字的作用:
- ✅
@context:定义词汇表的命名空间。https://schema.org是最常用的上下文,告诉解析器后续的属性名来自 Schema.org 词汇表 - ✅
@type:声明当前实体的类型,如Article、Product、FAQPage、Organization等 - ✅
@id:为实体分配唯一标识符(IRI),支持跨文档引用 - ✅
@graph:在同一文档中声明多个独立实体
💡 提示:
@context支持简写形式。当你只使用 Schema.org 时,直接写"https://schema.org"即可。如果需要混合多个词汇表(如 Schema.org + Dublin Core),可以使用对象形式定义前缀。
1.3 @graph 与实体关系建模
当页面包含多个关联实体时(比如一篇文章 + 作者 + 网站信息),使用 @graph 可以在一个 JSON-LD 块中声明所有实体,并通过 @id 建立引用关系:
// 使用 @graph 声明多个关联实体
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "https://jsjson.com/#website",
"name": "jsjson.com",
"url": "https://jsjson.com"
},
{
"@type": "Article",
"@id": "https://jsjson.com/blog/json-ld-guide/#article",
"headline": "JSON-LD 结构化数据实战",
"author": { "@id": "https://jsjson.com/#author-zhangsan" },
"isPartOf": { "@id": "https://jsjson.com/#website" },
"datePublished": "2026-06-09"
},
{
"@type": "Person",
"@id": "https://jsjson.com/#author-zhangsan",
"name": "张三",
"url": "https://jsjson.com/author/zhangsan"
}
]
}
📌 记住:
@graph中的每个实体都建议设置@id,这样搜索引擎才能正确解析实体间的引用关系。没有@id的实体无法被其他实体引用。
🚀 二、六大高频场景的 JSON-LD 实现
2.1 文章页(Article)—— 提升内容类搜索结果
文章页是最常见的 JSON-LD 场景。Google 搜索结果中的「文章卡片」、「发布日期」、「作者信息」都依赖 Article 结构化数据:
// 文章页的完整 JSON-LD 实现
{
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": "JSON-LD 结构化数据实战指南",
"description": "深入解析 JSON-LD 结构化数据的原理与实战",
"image": [
"https://jsjson.com/images/json-ld-guide-1x1.png",
"https://jsjson.com/images/json-ld-guide-4x3.png",
"https://jsjson.com/images/json-ld-guide-16x9.png"
],
"datePublished": "2026-06-09T08:00:00+08:00",
"dateModified": "2026-06-09T10:30:00+08:00",
"author": {
"@type": "Person",
"name": "张三",
"url": "https://jsjson.com/author/zhangsan"
},
"publisher": {
"@type": "Organization",
"name": "jsjson.com",
"logo": {
"@type": "ImageObject",
"url": "https://jsjson.com/logo.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://jsjson.com/blog/json-ld-guide"
},
"keywords": "JSON-LD, 结构化数据, Schema.org, SEO",
"wordCount": 2500,
"inLanguage": "zh-CN"
}
⚠️ 警告:Google 要求 Article 类型必须提供
author、datePublished和headline三个字段,否则无法触发文章富摘要。image字段建议提供至少 1200px 宽的图片。
2.2 产品页(Product)—— 电商搜索增强
产品页的 JSON-LD 可以触发搜索结果中的价格、评分、库存状态等富摘要,对电商类站点提升 CTR 效果显著:
// 产品页 JSON-LD:包含价格、评分、库存
{
"@context": "https://schema.org",
"@type": "Product",
"name": "机械键盘 Cherry MX Board 3.0S",
"image": "https://example.com/images/cherry-mx-board.jpg",
"description": "Cherry MX Board 3.0S 有线机械键盘,红轴",
"brand": {
"@type": "Brand",
"name": "Cherry"
},
"sku": "CHERRY-MX-30S-RED",
"offers": {
"@type": "Offer",
"url": "https://example.com/products/cherry-mx-board",
"priceCurrency": "CNY",
"price": "599.00",
"priceValidUntil": "2026-12-31",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "某电商平台"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "2389"
}
}
💡 提示:
offers.priceValidUntil字段如果不填,Google 可能不会展示价格富摘要。建议设置为未来日期并定期更新。
2.3 FAQ 页 —— 搜索结果折叠展示
FAQ 结构化数据是性价比最高的 SEO 优化手段之一。它能让搜索结果直接展示问答折叠列表,大幅增加页面在搜索结果中的「占地面积」:
// FAQ 页 JSON-LD:触发搜索结果中的折叠问答
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "JSON-LD 和 JSON 有什么区别?",
"acceptedAnswer": {
"@type": "Answer",
"text": "JSON-LD 是 JSON 的扩展,增加了 @context、@type 等语义关键字,用于表达结构化数据。普通的 JSON 只是数据交换格式,而 JSON-LD 让数据具有可被机器理解的含义。"
}
},
{
"@type": "Question",
"name": "JSON-LD 会影响页面加载速度吗?",
"acceptedAnswer": {
"@type": "Answer",
"text": "不会。JSON-LD 使用 <script type=\"application/ld+json\"> 标签,浏览器不会解析或渲染它。一个典型的 JSON-LD 块只有 1-3KB,对页面性能几乎零影响。"
}
},
{
"@type": "Question",
"name": "百度支持 JSON-LD 吗?",
"acceptedAnswer": {
"@type": "Answer",
"text": "百度从 2023 年开始逐步支持 JSON-LD 格式的结构化数据,但支持的 Schema.org 类型不如 Google 丰富。建议先通过百度搜索资源平台验证兼容性。"
}
}
]
}
📌 **记住:**FAQPage 类型要求页面上必须有可见的问答内容,不能只在 JSON-LD 中声明但页面上看不到。Google 会人工审核,违反规则可能导致手动惩罚。
2.4 面包屑导航(BreadcrumbList)
面包屑结构化数据能让搜索结果中显示页面的层级路径,提升用户对网站结构的理解:
// 面包屑导航 JSON-LD
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "首页",
"item": "https://jsjson.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "博客",
"item": "https://jsjson.com/blog"
},
{
"@type": "ListItem",
"position": 3,
"name": "JSON-LD 结构化数据实战"
}
]
}
2.5 组织信息(Organization)
在首页或「关于我们」页面添加组织信息,可以让 Google 知识面板展示你的品牌信息:
// 组织信息 JSON-LD:用于品牌知识面板
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "jsjson.com",
"url": "https://jsjson.com",
"logo": "https://jsjson.com/logo.png",
"description": "开发者在线工具箱,本地处理不上传服务器",
"sameAs": [
"https://github.com/jsjson",
"https://twitter.com/jsjson"
],
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"email": "support@jsjson.com"
}
}
2.6 软件应用(SoftwareApplication)
如果你在推广一个工具或 App,SoftwareApplication 类型可以让搜索结果展示评分和下载信息:
// 软件应用 JSON-LD
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "JSON 格式化工具",
"url": "https://jsjson.com/tool/json-format",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Web",
"description": "在线 JSON 格式化、压缩、转义工具",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "CNY"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"ratingCount": "1520"
}
}
⚙️ 三、生产级工程化实践
3.1 在 Nuxt 3 中动态注入 JSON-LD
对于使用 Nuxt 3 的项目,可以通过 useHead() 动态注入 JSON-LD,实现每页不同的结构化数据:
// composables/useJsonLd.js - Nuxt 3 中动态注入 JSON-LD 的组合式函数
export function useJsonLd(schema) {
useHead({
script: [
{
type: 'application/ld+json',
innerHTML: JSON.stringify(schema)
}
]
})
}
// 在页面中使用
// pages/blog/[slug].vue
const articleSchema = computed(() => ({
'@context': 'https://schema.org',
'@type': 'TechArticle',
headline: article.value.title,
datePublished: article.value.date,
dateModified: article.value.updatedAt,
author: {
'@type': 'Person',
name: article.value.author.name
},
publisher: {
'@type': 'Organization',
name: 'jsjson.com',
logo: { '@type': 'ImageObject', url: 'https://jsjson.com/logo.png' }
},
description: article.value.description,
image: article.value.coverImage,
wordCount: article.value.wordCount,
inLanguage: 'zh-CN'
}))
useJsonLd(articleSchema)
⚠️ **警告:**在 Nuxt 3 中使用
useHead()注入 JSON-LD 时,确保innerHTML是通过JSON.stringify()生成的。直接传入对象可能导致 HTML 转义问题。如果 JSON 内容中包含<或>,JSON.stringify()会自动转义为\u003c和\u003e。
3.2 JSON-LD 与 SSR/SSG 的最佳配合
JSON-LD 的一个关键优势是在 SSR/SSG 阶段完全可用。不同于需要浏览器执行的 JavaScript 逻辑,结构化数据在服务端渲染时就已经嵌入 HTML,搜索引擎爬虫可以直接读取:
// Nuxt 3 SSG 生成时,JSON-LD 被直接嵌入 HTML
// nuxt.config.ts
export default defineNuxtConfig({
nitro: {
prerender: {
routes: ['/blog/json-ld-guide', '/blog/mcp-guide']
}
}
})
// 生成的 HTML 中包含完整的 JSON-LD
// <script type="application/ld+json">
// { "@context": "https://schema.org", "@type": "TechArticle", ... }
// </script>
💡 提示:如果你的站点使用 CSR(客户端渲染),搜索引擎爬虫可能不会执行 JavaScript 来获取 JSON-LD。这就是为什么 SSR/SSG 对 SEO 至关重要——结构化数据需要在 HTML 源码中直接可读。
3.3 JSON-LD 生成与校验工具链
生产环境中,手动编写 JSON-LD 容易出错。推荐使用以下工具链:
| 工具 | 用途 | 推荐度 |
|---|---|---|
| Google Rich Results Test | 验证 JSON-LD 是否能触发富摘要 | ✅ 必用 |
| Schema.org Validator | 验证 Schema.org 合规性 | ✅ 推荐 |
| JSON-LD Playground | 在线调试 JSON-LD 的紧凑/展开形式 | ✅ 推荐 |
| schema-dts (npm) | TypeScript 类型定义,编译时校验 | ✅ 推荐 |
| 百度搜索资源平台 | 验证百度对结构化数据的支持 | ⚠️ 建议 |
使用 schema-dts 可以在 TypeScript 中获得 Schema.org 的完整类型定义,避免拼写错误和类型不匹配:
// 使用 schema-dts 获得编译时类型校验
// npm install schema-dts
import type { Article, WithContext } from 'schema-dts'
// TypeScript 会在编译时检查类型错误
const articleSchema: WithContext<Article> = {
'@context': 'https://schema.org',
'@type': 'Article',
headline: 'JSON-LD 实战指南',
datePublished: '2026-06-09',
author: {
'@type': 'Person',
name: '张三'
},
// 如果拼错字段名或类型不对,TypeScript 编译会报错
// wordCount: "两千字" ← ❌ 类型错误,应该是 number
wordCount: 2500 // ✅ 正确
}
3.4 多语言站点的 inLanguage 与 hreflang 配合
对于中英文双语站点(如 jsjson.com),JSON-LD 需要配合 hreflang 标签使用:
// 多语言文章的 JSON-LD 配置
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "JSON-LD 结构化数据实战",
"inLanguage": "zh-CN",
"url": "https://jsjson.com/blog/json-ld-guide",
"translationOfWork": {
"@type": "Article",
"headline": "JSON-LD Structured Data Guide",
"inLanguage": "en",
"url": "https://jsjson.com/en/blog/json-ld-guide"
}
}
同时在 HTML 中添加 hreflang 标签:
<!-- HTML <head> 中的 hreflang 标签与 JSON-LD 配合 -->
<link rel="alternate" hreflang="zh-CN" href="https://jsjson.com/blog/json-ld-guide" />
<link rel="alternate" hreflang="en" href="https://jsjson.com/en/blog/json-ld-guide" />
<link rel="alternate" hreflang="x-default" href="https://jsjson.com/blog/json-ld-guide" />
⚠️ 四、常见踩坑与避坑指南
4.1 ❌ 典型错误一:在 SPA 中只用 CSR 渲染 JSON-LD
很多 Vue/React 开发者通过客户端 JavaScript 动态生成 JSON-LD,但纯 CSR 渲染的结构化数据,Googlebot 不保证能抓到。Google 虽然能执行 JavaScript,但有延迟和预算限制:
❌ **错误写法:**纯 CSR 渲染的 JSON-LD
// ❌ 客户端渲染:Googlebot 可能看不到
onMounted(() => {
const script = document.createElement('script')
script.type = 'application/ld+json'
script.textContent = JSON.stringify(schemaData)
document.head.appendChild(script)
})
✅ **正确写法:**使用 SSR/SSG 确保 JSON-LD 在 HTML 源码中
// ✅ 服务端渲染:HTML 源码中直接包含 JSON-LD
useHead({
script: [{
type: 'application/ld+json',
innerHTML: JSON.stringify(schemaData)
}]
})
4.2 ❌ 典型错误二:忽略嵌套深度与循环引用
Schema.org 的实体可以无限嵌套,但搜索引擎解析有深度限制。过于深的嵌套可能导致部分数据被忽略:
// ❌ 嵌套过深:6 层以上搜索引擎可能截断
{
"@context": "https://schema.org",
"@type": "Article",
"author": {
"@type": "Person",
"worksFor": {
"@type": "Organization",
"memberOf": {
"@type": "Organization",
"parentOrganization": {
"@type": "Organization",
"name": "某集团"
}
}
}
}
}
✅ **正确写法:**使用 @id 引用代替深层嵌套
// ✅ 使用 @id 扁平化引用,避免深层嵌套
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"author": { "@id": "#author" }
},
{
"@id": "#author",
"@type": "Person",
"name": "张三",
"worksFor": { "@id": "#org" }
},
{
"@id": "#org",
"@type": "Organization",
"name": "某公司",
"parentOrganization": { "@id": "#parent-org" }
},
{
"@id": "#parent-org",
"@type": "Organization",
"name": "某集团"
}
]
}
4.3 ⚠️ 典型错误三:结构化数据与页面内容不一致
Google 的核心原则是:JSON-LD 中的数据必须与页面上用户可见的内容一致。如果你在 JSON-LD 中声明了 5 星评分,但页面上只显示 4 星,这属于结构化数据垃圾(Structured Data Spam),可能导致手动惩罚。
⚠️ **警告:**永远不要在 JSON-LD 中包含页面上不存在的信息。Google 的 SpamBrain 系统会交叉验证 JSON-LD 与页面内容,不一致会导致富摘要被移除甚至网站降权。
4.4 性能影响评估
JSON-LD 对页面性能的影响极小,但仍需注意:
| 指标 | 无 JSON-LD | 有 JSON-LD(1KB) | 有 JSON-LD(10KB) |
|---|---|---|---|
| HTML 大小 | 基准 | +1KB | +10KB |
| FCP 影响 | 无 | 无 | 无 |
| LCP 影响 | 无 | 无 | 无 |
| 解析时间 | 0ms | <1ms | <3ms |
💡 **提示:**单个页面建议 JSON-LD 总大小不超过 10KB。如果需要声明大量实体(如商品列表页每个商品都有结构化数据),考虑使用独立的
@graph块,而不是为每个商品创建单独的<script>标签。
📊 五、搜索引擎富摘要支持矩阵
不同搜索引擎对 JSON-LD 类型的支持程度不同,选择正确的类型至关重要:
| Schema.org 类型 | Google 富摘要 | 百度结构化 | Bing | 备注 |
|---|---|---|---|---|
| Article / TechArticle | ✅ 完整 | ✅ 基本 | ✅ 支持 | 最通用 |
| Product + Offer | ✅ 完整 | ✅ 支持 | ✅ 支持 | 电商必备 |
| FAQPage | ✅ 完整 | ✅ 支持 | ❌ 已下线 | Google 已限制展示 |
| HowTo | ✅ 完整 | ⚠️ 部分 | ❌ 已下线 | 操作指南 |
| BreadcrumbList | ✅ 完整 | ✅ 支持 | ✅ 支持 | 建议全站使用 |
| Organization | ✅ 知识面板 | ⚠️ 有限 | ⚠️ 有限 | 品牌展示 |
| SoftwareApplication | ✅ 完整 | ⚠️ 有限 | ❌ | App 类站点 |
| Review + AggregateRating | ✅ 完整 | ✅ 支持 | ⚠️ 有限 | 需结合 Product |
⚠️ 警告:Google 从 2023 年起限制了 FAQPage 富摘要的展示范围——仅对知名权威网站展示。中小网站的 FAQ 结构化数据可能不会触发富摘要,但仍建议添加,因为有助于 Google 理解页面内容。
💡 六、实用工具推荐与自动化方案
6.1 自动生成 JSON-LD 的 npm 工具
// 使用 schema-dts 从 TypeScript 接口自动生成 JSON-LD
// npm install schema-dts
import type { Product, WithContext } from 'schema-dts'
interface ProductData {
name: string
price: number
currency: string
rating: number
reviewCount: number
imageUrl: string
description: string
inStock: boolean
}
// 将业务数据转换为 Schema.org 格式
function toProductSchema(data: ProductData): WithContext<Product> {
return {
'@context': 'https://schema.org',
'@type': 'Product',
name: data.name,
description: data.description,
image: data.imageUrl,
offers: {
'@type': 'Offer',
price: data.price.toString(),
priceCurrency: data.currency,
availability: data.inStock
? 'https://schema.org/InStock'
: 'https://schema.org/OutOfStock'
},
aggregateRating: {
'@type': 'AggregateRating',
ratingValue: data.rating.toString(),
reviewCount: data.reviewCount.toString()
}
}
}
6.2 jsjson.com 在线工具推荐
在处理 JSON-LD 时,以下 jsjson.com 工具可以帮助你:
- ✅ JSON 格式化:格式化 JSON-LD 以便阅读和调试
- ✅ JSON 校验:验证 JSON-LD 语法是否正确
- ✅ JSON 转义:将 JSON-LD 嵌入 HTML 时处理特殊字符
- ✅ JSON 压缩:生产环境压缩 JSON-LD 体积
📌 总结
JSON-LD 是连接你的网站与搜索引擎之间的「语义桥梁」。掌握它不需要理解复杂的 RDF 理论,只需要遵循几个核心原则:
- ✅ 使用
@context+@type声明语义——这是 JSON-LD 与普通 JSON 的核心区别 - ✅ 选择正确的 Schema.org 类型——Article、Product、FAQPage 是最常用的三大类型
- ✅ 通过 SSR/SSG 确保爬虫可读——不要依赖客户端渲染 JSON-LD
- ✅ 使用
@id+@graph管理复杂关系——避免深层嵌套 - ✅ 结构化数据必须与页面内容一致——否则会被 Google 惩罚
- ✅ 用 Rich Results Test 验证后再上线——避免上线后才发现问题
⚡ **关键结论:**JSON-LD 不只是 SEO 工具,它是让机器理解网页语义的基础设施。随着 AI 搜索(SGE、Perplexity)的兴起,结构化数据的重要性只会越来越高——AI 模型需要清晰的语义输入,而 JSON-LD 正是最标准化的语义表达方式。现在投入 1-2 小时为你的核心页面添加 JSON-LD,可能在未来几年持续带来搜索流量增长。