JSON-LD 结构化数据:完整 SEO 实施指南

最后更新 2026/3/28
结构化数据 丰富结果

JSON-LD 结构化数据准确告知搜索引擎您的内容主题。正确的 schema 标记可解锁 Google 搜索中的丰富结果,如常见问题下拉、文章轮播、面包屑导航等,直接显示在搜索结果页。

本指南涵盖所有主要 schema 类型,附带真实 C# 实现代码及对应 JSON 输出,所有示例均源自生产环境 Blazor 代码库。

示意图展示 JSON-LD 结构化数据如何驱动 Google 搜索中的丰富结果,包括常见问题下拉、文章轮播和面包屑导航
JSON-LD 结构化数据是最易维护的 schema 标记方式,存放于 script 标签中,完全独立于 HTML 代码。

什么是 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 字段。

C#ArticleSchema C# 类(JsonLdService.cs)
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 表示文章主题范围。

HTML文章 schema JSON-LD 输出
<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 属性的答案)。

C#FaqPage C# 类(JsonLdService.cs)
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 支持每页最多十个问题的丰富结果。

HTMLFAQ schema JSON-LD 输出
<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。

C#WebSiteSchema 和 WebPageSchema C# 类(JsonLdService.cs)
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 构建完整实体模型。

HTMLWebSite 和 WebPage schema JSON-LD 输出
<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 传递给该工具。

C#WrapInScriptTag 方法(JsonLdService.cs)
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 列表、面包屑层级和文章数据。

C#BuildSchema 分发逻辑(JsonLdService.cs)
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 错误和警告,适合初次验证后持续监控。

上线后大规模监控

常见问题解答

常见 JSON-LD schema 标记问题解答