JSON-LDスキーママークアップ:完全なSEO実装ガイド

最終更新 2026/03/28
構造化データ リッチリザルト

JSON-LD構造化データは検索エンジンにコンテンツの内容を正確に伝えます。適切なスキーママークアップでGoogle検索のリッチリザルトを実現します。

本ガイドでは主要なスキーマタイプを実際のC#コードと生成されるJSON出力と共に解説。すべて実運用中のBlazorコードからの例です。

JSON-LD構造化データがGoogle検索のFAQドロップダウンや記事カルーセル、パンくずリストにリッチリザルトを提供する図解
JSON-LD構造化データはスキーママークアップを追加する最も保守しやすい方法で、HTMLとは別のscriptタグ内に記述されます。

JSON-LDとは何か、SEOで重要な理由

JSON-LDはJSON形式で構造化データを記述する方法です。Googleなどの検索エンジンはキーワードだけでなく内容の意味を理解します。

Googleが構造化データを解析できると、評価やFAQドロップダウン、記事画像、パンくずリストなどを表示するリッチリザルトの対象となり、クリック率が向上します。

GoogleはJSON-LDを推奨しています。head内などどこにでも配置でき、既存のHTMLを変更せずに済むため、構造化データがマークアップから完全に分離されます。

リッチリザルトの対象条件

有効なスキーママークアップにより、FAQドロップダウンや記事カルーセル、パンくずリストなどのリッチ機能の対象になります。

同じ順位でクリック数増加

意味の明確化

構造化データは曖昧さを排除します。Q&AページはFAQPageと明示され、GoogleはFAQリッチリザルトとして表示します。

検索エンジンに正確な情報を伝える

HTMLの変更不要

JSON-LDはhead内のscriptタグにあり、視覚的なHTMLには影響しません。スキーマの追加や更新でレイアウトやアクセシビリティが壊れる心配がありません。

責務の明確な分離

JSON-LDとMicrodata、RDFaの違い

schema.org構造化データの埋め込みには3つの形式があり、Googleはすべて理解しますが、適用方法や保守性に大きな違いがあります。

フォーマット 構文の場所 保守性 SEOへの影響 Googleの推奨
JSON-LD 別のscriptタグ 簡単でHTML変更不要 リッチリザルト完全対応 推奨
Microdata HTML属性のインライン記述 高いがマークアップに密接に依存 リッチリザルト完全対応 対応済み
RDFa HTML属性のインライン記述 高いがマークアップに密接に依存 リッチリザルト完全対応 対応済み

JSON-LDが保守性で優れる理由

MicrodataやRDFaはHTML内にスキーマ属性が散在し、テンプレート変更で構造化データが壊れる恐れがあります。JSON-LDは独立したブロックで、スクリプト更新のみで済みます。

Web開発学習のおすすめ

SEO対策を活かした最新Web開発の習得

私からのヒント このコースは、技術的SEOや構造化データ、最新のWeb標準が実際のプロジェクトでどう連携するか理解するのに役立ちました。

  • HTMLメタタグ、Open Graph、JSON-LDの構造化データ実装を学べます。
  • 検索エンジンでの表示と順位向上に役立つ実践的なSEO戦略。
  • レスポンシブデザインやパフォーマンス最適化の実践プロジェクト。
Web開発コースを詳しく見る

主要スキーマタイプと使用タイミング

Schema.orgには数百のタイプがありますが、主要な数種類がウェブコンテンツの大半を占め、Google検索のリッチリザルトを実現します。

スキーマタイプ 利用例 リッチリザルトの種類
Article ブログ記事、ガイド、ニュース記事 記事カルーセル、トップストーリー
FAQPage Q&A形式のページ 検索結果のFAQドロップダウン
BreadcrumbList ナビゲーション階層のあるページ URL下のパンくずリスト
WebSite / WebPage ホームページ、ハブページ、ランディングページ サイトリンク検索ボックス、エンティティ認識
SoftwareApplication アプリ、ツール、ソフトウェア製品 評価・価格付きアプリリッチリザルト

Schema.org語彙

すべてのスキーマタイプはschema.orgで定義され、JSON-LDの@contextで語彙を指定します。複数タイプを同一ページで組み合わせ可能で、Googleは各スクリプトを独立処理します。

記事スキーマの実装

記事スキーマはコンテンツ主体のサイトで最重要です。見出し、説明、公開日、著者、発行者を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記事スキーマの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>

authorとpublisherはOrganization型です。個人ブログではauthorを名前とURLを持つPerson型にできます。

FAQスキーマによるリッチスニペット

FAQPageスキーマはGoogle検索結果に展開可能なQ&Aペアを表示し、縦の表示領域を広げて視認性とクリック率を向上させます。

FaqPageクラスは質問エンティティのリストを保持し、各エンティティはname(質問)とacceptedAnswer(回答テキスト)を持ちます。

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; }
}

出力はmainEntity配列を持つ単一のFAQPageブロックで、各項目はacceptedAnswer付きのQuestion型です。Googleは1ページ最大10件の質問をリッチリザルト対応します。

HTMLFAQスキーマの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は特定のURLフラグメントにスキーマを紐付けます。複数スキーマがあるページで各エンティティを明確に識別するためのベストプラクティスです。

WebSiteとWebPageスキーマ

WebSiteとWebPageスキーマはサイトの基本的なエンティティグラフを構築します。WebSiteはサイト名、URL、言語、発行者を示し、WebPageは個別ページを親WebSiteにisPartOfで紐付けます。

両クラスは同じ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スキーマの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タグでラップします。

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メソッドの入口で、ページのスキーマブロック全体を構築するためのタイプ、メタデータ、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);
}

ディスパッチスイッチによりスキーマビルダーは合成可能です。FAQやパンくずはページタイプに関係なく存在すれば常に追加され、コアロジックの変更なしに任意のページに追加可能です。

スキーマのテストと検証

有効なJSON-LD構文はリッチリザルトの対象を保証しません。Googleのツールは構文の妥当性とコンテンツのポリシー適合を検証します。

リッチリザルトテスト

search.google.com/test/rich-resultsでURLやHTMLをテスト可能。検出されたリッチリザルトの種類と不足プロパティを確認できます。

Google公式の適格性チェックツール

スキーママークアップバリデーター

validator.schema.orgはGoogleのリッチリザルトポリシーとは独立してschema.org仕様に準拠しているか検証し、プロパティ名の誤字や型の不一致を検出します。

Schema.org構文検証

Googleサーチコンソール

Search ConsoleのEnhancementsセクションはインデックス済みページのスキーマエラーや警告を一括報告し、初期検証後の継続監視に役立ちます。

公開後の大規模監視

よくある質問

JSON-LDスキーママークアップのよくある質問への回答