目次
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は独立したブロックで、スクリプト更新のみで済みます。
SEO対策を活かした最新Web開発の習得
私からのヒント このコースは、技術的SEOや構造化データ、最新のWeb標準が実際のプロジェクトでどう連携するか理解するのに役立ちました。
- HTMLメタタグ、Open Graph、JSON-LDの構造化データ実装を学べます。
- 検索エンジンでの表示と順位向上に役立つ実践的なSEO戦略。
- レスポンシブデザインやパフォーマンス最適化の実践プロジェクト。
主要スキーマタイプと使用タイミング
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の対応フィールドにマッピングされます。
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>authorとpublisherはOrganization型です。個人ブログではauthorを名前とURLを持つPerson型にできます。
FAQスキーマによるリッチスニペット
FAQPageスキーマはGoogle検索結果に展開可能なQ&Aペアを表示し、縦の表示領域を広げて視認性とクリック率を向上させます。
FaqPageクラスは質問エンティティのリストを保持し、各エンティティはname(質問)とacceptedAnswer(回答テキスト)を持ちます。
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件の質問をリッチリザルト対応します。
<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です。
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タグでラップします。
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メソッドの入口で、ページのスキーマブロック全体を構築するためのタイプ、メタデータ、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);
}ディスパッチスイッチによりスキーマビルダーは合成可能です。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セクションはインデックス済みページのスキーマエラーや警告を一括報告し、初期検証後の継続監視に役立ちます。
公開後の大規模監視
