JSON-LD 结构化数据:完整 SEO 实施指南
JSON-LD 结构化数据准确告知搜索引擎您的内容主题。正确的 schema 标记可解锁 Google 搜索中的丰富结果,如常见问题下拉、文章轮播、面包屑导航等,直接显示在搜索结果页。
本指南涵盖所有主要 schema 类型,附带真实 C# 实现代码及对应 JSON 输出,所有示例均源自生产环境 Blazor 代码库。

目录
什么是 JSON-LD 及其对 SEO 的重要性
JSON-LD(链接数据的 JavaScript 对象表示法)是一种使用 JSON 格式编码结构化数据的方法。Google 等搜索引擎通过它理解内容含义,而非仅识别关键词。
当 Google 能解析您的结构化数据时,页面有资格获得丰富结果——在搜索结果页直接展示评分、常见问题下拉、文章图片、面包屑导航等视觉增强内容。丰富结果的点击率远高于普通蓝色链接。
Google 官方推荐使用 JSON-LD 替代 Microdata 和 RDFa,因为它可放置于页面任意位置(包括 head),且无需修改现有 HTML 元素,结构化数据与标记完全解耦。
丰富结果资格
有效的 schema 标记使您的页面有资格获得 Google 搜索中的常见问题下拉、文章轮播、面包屑导航及其他丰富功能。
同排名带来更多点击
语义清晰度
结构化数据消除歧义。关于问答主题的页面明确声明为 FAQPage,Google 因此能将其渲染为常见问题丰富结果。
准确告知搜索引擎您的内容
无需修改 HTML
JSON-LD 存放于 head 中的 script 标签,完全不影响视觉 HTML,添加或更新 schema 不会破坏布局或无障碍。
职责清晰分离
JSON-LD 与 Microdata 和 RDFa 比较
网页中嵌入 schema.org 结构化数据有三种格式,Google 均支持,但它们在应用和维护方式上差异显著。
| 格式 | 语法位置 | 维护 | SEO 影响 | Google 推荐 |
|---|---|---|---|---|
| JSON-LD | 独立 script 标签 | 简单——无需修改 HTML | 全面支持丰富结果 | 推荐 |
| Microdata | 内联 HTML 属性 | 高度耦合标记 | 全面支持丰富结果 | 支持 |
| RDFa | 内联 HTML 属性 | 高度耦合标记 | 全面支持丰富结果 | 支持 |
JSON-LD 在维护性上的优势
Microdata 和 RDFa 的 schema 属性分散在 HTML 中,模板结构变更可能导致结构化数据失效。JSON-LD 是独立块,更新一次脚本,HTML 不受影响。
掌握现代网页开发与SEO最佳实践
我的建议 我认为这门课程有助于理解技术SEO、结构化数据与现代网页标准在实际项目中的结合。
- 学习HTML元标签、Open Graph和JSON-LD结构化数据的实现。
- 实用SEO策略,提升搜索引擎可见度和排名。
- 动手项目涵盖响应式设计与性能优化。
核心 schema 类型及使用时机
Schema.org 定义了数百种类型,但少数类型覆盖大部分网页内容,这些类型可解锁 Google 搜索中的丰富结果。
| Schema 类型 | 使用场景 | 丰富结果类型 |
|---|---|---|
| Article | 博客文章、指南、新闻报道 | 文章轮播、头条新闻 |
| FAQPage | 问答页面 | 搜索结果中的常见问题下拉 |
| BreadcrumbList | 具有导航层级的页面 | URL 下方的面包屑导航 |
| WebSite / WebPage | 首页、中心页、着陆页 | 站点链接搜索框、实体识别 |
| SoftwareApplication | 应用、工具、软件产品 | 带评分和价格的应用丰富结果 |
Schema.org 词汇表
所有 schema 类型均定义于 schema.org。每个 JSON-LD 块中的 @context 属性指示解析器根据 schema.org 词汇表解释属性名。单页可组合多种 schema 类型,Google 独立处理每个脚本块。
文章 schema 实现
文章 schema 是内容驱动网站最重要的类型,告知 Google 标题、描述、发布日期、作者和发布者——丰富结果资格的最低属性集。
下面的 C# 类是序列化模型,每个属性通过 JsonPropertyName 特性直接映射到对应的 JSON-LD 字段。
private class ArticleSchema
{
[JsonPropertyName("@context")]
public string Context { get; } = "https://schema.org";
[JsonPropertyName("@type")]
public string Type { get; } = "Article";
[JsonPropertyName("headline")]
public string? Headline { get; set; }
[JsonPropertyName("description")]
public string? Description { get; set; }
[JsonPropertyName("image")]
public string? Image { get; set; }
[JsonPropertyName("url")]
public string? Url { get; set; }
[JsonPropertyName("author")]
public Organization? Author { get; set; }
[JsonPropertyName("publisher")]
public ArticlePublisher? Publisher { get; set; }
[JsonPropertyName("datePublished")]
public string? DatePublished { get; set; }
[JsonPropertyName("dateModified")]
public string? DateModified { get; set; }
[JsonPropertyName("articleSection")]
public List<string>? ArticleSection { get; set; }
}必需属性包括:headline、image、datePublished、dateModified、author 和 publisher。articleSection 数组为可选但推荐,用于向 Google 表示文章主题范围。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "JSON-LD Schema Markup: Complete SEO Implementation Guide",
"description": "Learn how to implement JSON-LD structured data for Article, FAQPage, BreadcrumbList, WebSite, and WebPage schema types.",
"image": "https://ghostlyinc.com/images/web/jsonldguide/opengraph/hero-1200.png",
"url": "https://ghostlyinc.com/en/json-ld-schema-markup-seo-guide/",
"author": {
"@type": "Organization",
"name": "GhostlyInc",
"url": "https://ghostlyinc.com"
},
"publisher": {
"@type": "Organization",
"name": "GhostlyInc",
"logo": {
"@type": "ImageObject",
"url": "https://ghostlyinc.com/images/logo.png"
}
},
"datePublished": "2026-03-28T10:00:00Z",
"dateModified": "2026-03-28T10:00:00Z",
"articleSection": [
"What is JSON-LD and why it matters for SEO",
"JSON-LD vs. Microdata vs. RDFa",
"Core schema types and when to use them",
"Article schema implementation"
]
}
</script>作者和发布者均为 Organization 类型,个人博客中作者可为 Person 类型,包含姓名和网址。
常见问题丰富摘要的 FAQ schema
FAQPage schema 生成常见问题丰富结果——可展开的问答对,直接显示在 Google 搜索结果页面,显著增加结果占用的垂直空间,提升可见度和点击率。
FaqPage 类包含问题实体列表,每个实体必须有 name(问题)和 acceptedAnswer(包含 text 属性的答案)。
private class FaqPage
{
[JsonPropertyName("@context")]
public string Context { get; } = "https://schema.org";
[JsonPropertyName("@type")]
public string Type { get; } = "FAQPage";
[JsonPropertyName("@id")]
public string? Id { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("mainEntity")]
public List<FaqEntity>? MainEntity { get; set; }
}
private class FaqEntity
{
[JsonPropertyName("@type")]
public string Type { get; } = "Question";
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("acceptedAnswer")]
public FaqAnswer? AcceptedAnswer { get; set; }
}
private class FaqAnswer
{
[JsonPropertyName("@type")]
public string Type { get; } = "Answer";
[JsonPropertyName("text")]
public string? Text { get; set; }
}输出为单个 FAQPage 块,包含 mainEntity 数组,每项为带 acceptedAnswer 的 Question 类型。Google 支持每页最多十个问题的丰富结果。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"@id": "https://ghostlyinc.com/en/json-ld-schema-markup-seo-guide/#faq",
"name": "Frequently asked questions",
"mainEntity": [
{
"@type": "Question",
"name": "What is the difference between JSON-LD and Microdata?",
"acceptedAnswer": {
"@type": "Answer",
"text": "JSON-LD is a separate script block that lives in the head and does not touch HTML. Microdata adds attributes directly to HTML elements. Google recommends JSON-LD for its maintainability."
}
},
{
"@type": "Question",
"name": "How many FAQ questions can I mark up?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Google supports up to ten questions per page for the FAQ rich result. Additional questions are still valid schema but will not appear in the search result enhancement."
}
}
]
}
</script>FAQPage 块上的 @id 将 schema 锚定到特定 URL 片段,是包含多个 schema 块页面的最佳实践,便于解析器明确识别每个实体。
WebSite 和 WebPage schema
WebSite 和 WebPage schema 建立网站的基础实体图。WebSite 标识网站本身,包括名称、URL、语言和发布者。WebPage 描述单个页面,并通过 isPartOf 关系链接到父 WebSite。
两个类遵循相同的 JSON-LD 模式。WebSite 的 @id 是域名根,WebPage 的 @id 是完整页面 URL。
private class WebSiteSchema
{
[JsonPropertyName("@context")]
public string Context { get; } = "https://schema.org";
[JsonPropertyName("@type")]
public string Type { get; } = "WebSite";
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("url")]
public string? Url { get; set; }
[JsonPropertyName("inLanguage")]
public string? InLanguage { get; set; }
[JsonPropertyName("publisher")]
public Organization? Publisher { get; set; }
}
private class WebPageSchema
{
[JsonPropertyName("@context")]
public string Context { get; } = "https://schema.org";
[JsonPropertyName("@type")]
public string Type { get; } = "WebPage";
[JsonPropertyName("@id")]
public string? Id { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; }
[JsonPropertyName("description")]
public string? Description { get; set; }
[JsonPropertyName("url")]
public string? Url { get; set; }
[JsonPropertyName("inLanguage")]
public string? InLanguage { get; set; }
[JsonPropertyName("isPartOf")]
public WebSiteReference? IsPartOf { get; set; }
}inLanguage 属性使用 BCP 47 语言代码(如 en、de、fr)。isPartOf 关联将 WebPage 绑定到 WebSite 实体,引用域名的 @id,帮助 Google 构建完整实体模型。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "GhostlyInc",
"url": "https://ghostlyinc.com",
"inLanguage": "en",
"publisher": {
"@type": "Organization",
"name": "GhostlyInc",
"url": "https://ghostlyinc.com"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"@id": "https://ghostlyinc.com/en/json-ld-schema-markup-seo-guide/",
"name": "JSON-LD Schema Markup: Complete SEO Implementation Guide",
"description": "Learn how to implement JSON-LD structured data for Article, FAQPage, BreadcrumbList, WebSite, and WebPage schema types.",
"url": "https://ghostlyinc.com/en/json-ld-schema-markup-seo-guide/",
"inLanguage": "en",
"isPartOf": {
"@type": "WebSite",
"@id": "https://ghostlyinc.com"
}
}
</script>实施最佳实践
WrapInScriptTag 辅助方法是将 JSON 字符串转换为有效 JSON-LD 块的唯一入口,包装为带有 application/ld+json MIME 类型的 script 标签。
这是服务中所有 schema 构建器调用的方法——Article、FAQPage、BreadcrumbList、WebSite 和 WebPage 都将序列化的 JSON 传递给该工具。
private static MarkupString WrapInScriptTag(string json)
{
var builder = new StringBuilder();
builder.AppendLine("<script type=\"application/ld+json\">");
builder.AppendLine(json);
builder.AppendLine("</script>");
return new MarkupString(builder.ToString());
}SchemaContext 对象是 BuildSchema 方法的入口,承载构建页面完整 schema 块所需的所有数据——类型、元数据、FAQ 列表、面包屑层级和文章数据。
public SchemaBuildResult BuildSchema(SchemaContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
var jsonLd = new List<MarkupString>();
switch (context.PageType)
{
case PageSchemaType.Home:
jsonLd.Add(WebSite(context));
jsonLd.Add(WebPage(context));
break;
case PageSchemaType.Article:
jsonLd.Add(Article(context.Article!));
break;
case PageSchemaType.Tool:
jsonLd.Add(WebPage(context));
jsonLd.Add(SoftwareApplication(context.SoftwareApplication!));
break;
case PageSchemaType.Hub:
jsonLd.Add(WebPage(context));
break;
}
if (context.Faqs != null && context.Faqs.Count > 0)
{
jsonLd.Add(FAQ(context.Faqs.ToList(), context.FaqTitle, context.Url));
}
if (context.ParentHierarchy.Count > 0)
{
jsonLd.Add(BreadcrumbList(BuildBreadcrumbItems(context)));
}
return new SchemaBuildResult(jsonLd, context.PageType == PageSchemaType.Article);
}分发开关使 schema 构建器可组合。无论页面类型如何,只要存在 FAQ 和面包屑,都会被追加,意味着任何页面类型都可添加 FAQ 块或面包屑导航,无需修改核心分发逻辑。
测试与验证您的 schema
有效的 JSON-LD 语法不保证获得丰富结果资格。Google 工具会检查语法有效性及内容是否符合各类丰富结果的政策要求。
丰富结果测试
使用 search.google.com/test/rich-results 测试任意 URL 或粘贴原始 HTML,Google 会确认检测到的丰富结果类型并标出缺失的必需属性。
Google 官方资格检测工具
Schema 标记验证器
validator.schema.org 独立于 Google 丰富结果政策,依据 schema.org 规范检查您的标记,帮助发现属性名拼写错误和类型不匹配。
Schema.org 语法验证
Google 搜索控制台
搜索控制台的增强功能部分可批量报告索引页面的 schema 错误和警告,适合初次验证后持续监控。
上线后大规模监控