構造化データの検証・運用完全ガイド:Rich Results Test・AIOGeoScan・頻出エラー10選
各章へクイックジャンプ:
JSON-LDを実装したら終わりではありません。 実装した構造化データが正しく動作しているかを検証し、 コンテンツ追加・デザイン変更・フレームワークアップデートのたびに崩れていないかを監視する「品質維持サイクル」 が不可欠です。 本章では、Googleの公式ツールから AIOGeoScan までの検証環境と、 現場で最も多く遭遇するエラー10選とその修正コードを解説します。
1. 検証ツール全体像:どれを使えばよいか
| ツール | 提供者 | 主な用途 | 特徴 |
|---|---|---|---|
| Google Rich Results Test | リッチリザルト適格性の確認 | Googleの公式判定。URLとHTMLコード両方でテスト可能 | |
| Google Search Console | 本番サイトの継続監視 | 「拡張」タブでリッチリザルトの表示数・エラー推移を追跡 | |
| schema.org Validator | schema.org | schema.org仕様への準拠確認 | Google以外のスキーマ仕様を厳格にチェック。JSON-LDテキストを直接入力可能 |
| AIOGeoScan | Bennu Inc. | 構造化データ + AI検索最適化の総合診断 | JSON-LDエラー+llms.txt+E-E-A-T+AI検索スコアを一括チェック |
2. Google Rich Results Test の使い方
Google Rich Results Test は、構造化データ実装後に最初に使うべき公式ツールです。 URLを入力するだけで、Googleがそのページのスキーマをどう解釈するか、 リッチリザルトとして表示される資格があるかを即座に判定します。
search.google.com/test/rich-results を開き、テスト対象のURLを入力します。 本番公開前のローカル環境では「コードのテスト」タブにHTMLソースを直接貼り付けてテストします。警告(オレンジ):推奨プロパティが欠けています。リッチリザルスの表示は可能ですが、品質向上のために追加を検討してください。
3. Google Search Console での継続監視
Rich Results Test は「今この瞬間」のスナップショット確認です。 一方、Google Search Console は本番サイトのリッチリザルトの 表示数・エラーの推移を時系列で追跡できます。 月1回以上のペースで確認する習慣をつけましょう。
Search Console の左メニュー →「拡張」セクション。 Article、FAQPage など実装済みスキーマのタイプごとに項目が表示されます。
「エラー」のあるURL数が増加していないか。 「リッチリザルトの表示回数」がデプロイ後に下がっていないか。 急落した場合は実装変更が原因の可能性があります。
個別URLを「URLの検査」に入力すると、Googleが最後にクロールした時点の ページ情報と構造化データの解析結果を確認できます。 「ライブURLをテスト」で即時確認も可能。
4. 現場で頻出する JSON-LD エラートップ10と修正コード
AIOGeoScanの診断データと、Google Search Consoleのエラーレポートから集計した最も多く発生するJSON-LDエラー を10件紹介します。 各エラーには修正コードを添えています。
エラー1:重要プロパティ headline を入れ忘れる(Article)
Googleの Article ドキュメントでは headline は「推奨」扱いですが、 実務上はほぼ必須レベルの重要プロパティです。title や name と混同して省略されるケースが多いです。
// ❌ NG
{ "@type": "Article", "title": "記事タイトル" }
// ✅ OK
{ "@type": "Article", "headline": "記事タイトル" }エラー2:image の解像度不足(Article)
Googleは 16:9・4:3・1:1 の複数高解像度画像を推奨しており、 面積の目安は 50K pixels 以上 です。 OGP用の小さな画像をそのまま流用しているケースでよく問題になります。
// ✅ 3アスペクト比を提供する(推奨) "image": [ "https://example.com/img/article-1200x1200.jpg", // 1:1 "https://example.com/img/article-1200x900.jpg", // 4:3 "https://example.com/img/article-1200x675.jpg" // 16:9 ]
エラー3:datePublished が ISO 8601 形式でない
日本語形式("2026年4月12日")や スラッシュ区切り("2026/04/12")での記述は無効です。
// ❌ NG "datePublished": "2026年4月12日" "datePublished": "2026/04/12" // ✅ OK(ISO 8601 形式) "datePublished": "2026-04-12" "datePublished": "2026-04-12T09:00:00+09:00" // タイムゾーン付きが推奨
エラー4:FAQPage の acceptedAnswer が欠落
FAQPage で Question は定義しているのに acceptedAnswer がない。 または acceptedAnswer の @type: "Answer" が省略されているケース。
// ❌ NG
{
"@type": "Question",
"name": "質問文",
"answer": "回答文" // ← プロパティ名が違う
}
// ✅ OK
{
"@type": "Question",
"name": "質問文",
"acceptedAnswer": {
"@type": "Answer",
"text": "回答文"
}
}エラー5:@type の大文字小文字ミス
schema.org のタイプ名は PascalCase(先頭大文字)です。"organization"(小文字)や "FAQ page"(スペース)は無効です。
// ❌ NG(よくあるtypo) "@type": "organization" → ✅ "Organization" "@type": "blogpost" → ✅ "BlogPosting" "@type": "faqpage" → ✅ "FAQPage" "@type": "breadcrumblist" → ✅ "BreadcrumbList" "@type": "howto" → ✅ "HowTo"
エラー6:BreadcrumbList の position が非連続・重複
position は 1 から始まる連続した整数でなければなりません。 動的生成でインデックスを誤ると非連続になります。
// ❌ NG(position が 0 から始まっている、または重複)
[
{ "position": 0, "name": "ホーム" },
{ "position": 1, "name": "ブログ" },
{ "position": 1, "name": "記事タイトル" } // 重複
]
// ✅ OK(1から始まる連続した整数)
[
{ "@type": "ListItem", "position": 1, "name": "ホーム", "item": "https://..." },
{ "@type": "ListItem", "position": 2, "name": "ブログ", "item": "https://..." },
{ "@type": "ListItem", "position": 3, "name": "記事タイトル", "item": "https://..." }
]エラー7:AggregateRating の評価値が範囲外
ratingValue が bestRating を超えている場合や、bestRating と worstRating が省略されているためGoogleが範囲を判断できないケース。
// ❌ NG(bestRating が省略されている)
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "100"
}
// ✅ OK(bestRating・worstRating を明示)
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "100",
"bestRating": "5",
"worstRating": "1"
}エラー8:JSON.stringify だけで安全だと思い込む
記事タイトルや説明文に <・>・& などのHTML特殊文字が含まれると、dangerouslySetInnerHTML を通じてXSSリスクが生じます。JSON.stringify は便利ですが、それだけでは悪意ある文字列を完全には無害化しません。CMSや外部入力を扱う場合は、追加の置換まで含めて実装するのが安全です。
// ✅ 追加の置換を行う
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(jsonLd).replace(/</g, '\u003c')
}}
/>
// ⚠️ テンプレートリテラルでの文字列結合は危険
// ❌ NG:タイトルにHTMLが混入するリスクがある
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: `{"headline": "${post.title}"}` }}
/>エラー9:logo の URL が相対パス(Organization)
/logo.png(相対URL)を指定するとGoogleがロゴを取得できません。 すべての URL プロパティは 完全な絶対URL(https:// から始まる)で記述します。
// ❌ NG(相対URL)
"logo": { "@type": "ImageObject", "url": "/logo.png" }
// ✅ OK(絶対URL)
"logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }エラー10:ページコンテンツとスキーマの内容不一致
FAQPageスキーマにQ&Aを記述しているが、実際のHTMLページにはQ&Aコンテンツが存在しない。 または Article スキーマの headline がページの <h1> と全く異なる内容。 Googleはページのコンテンツとスキーマの整合性を確認しており、 不一致はスパム扱いになる可能性があります。
解決策:スキーマはページに実際に存在するコンテンツを機械語に翻訳したものでなければなりません。 スキーマ先行でコンテンツ後付けという実装順序は避けてください。
5. AIOGeoScan を使った継続的品質管理フロー
複数ページを持つサイトで構造化データを手動管理するには限界があります。AIOGeoScan を活用することで、 JSON-LDのエラー検出・llms.txtとの整合性確認・AI検索最適化スコアの追跡を 自動化できます。
診断したいURLを入力するだけで、JSON-LDスキーマのエラー・警告を自動検出。 複数ページを横断してスコアを比較することで優先度の高い修正箇所を特定できます。
Organization・Person スキーマの完成度をE-E-A-T観点からスコアリング。 不足しているプロパティと、それがGoogleの評価にどう影響するかを解説します。
ChatGPT Search・Perplexity・Google AI Overviewsへの引用適格性を評価。 FAQPage・HowToスキーマの有無や、llms.txtとの整合性を含めた総合スコアを提供します。
6. 開発フローへの組み込み:デプロイ前の自動バリデーション
Next.jsプロジェクトでは、プルリクエストのマージ前に構造化データの検証を CI/CDパイプラインに組み込むことで、デプロイ後のエラー混入を防げます。
# .github/workflows/seo-validation.yml
name: SEO & Structured Data Validation
on:
pull_request:
branches: [main]
jobs:
validate-json-ld:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Build Next.js
run: npm run build
- name: Start server
run: npm start &
- name: Wait for server
run: npx wait-on http://localhost:3000
- name: Validate JSON-LD on key pages
run: |
# schema-validator CLI や独自スクリプトでJSON-LDを抽出・検証
# 例:主要ページのJSONLDを取得してエラーがないか確認
node scripts/validate-jsonld.js --urls "http://localhost:3000,http://localhost:3000/blog/sample" --fail-on-error- Google Search Console「拡張」タブでエラー数が増加していないか確認
- AIOGeoScan で主要ページのスコアに低下がないか確認
- 新規追加ページに JSON-LD が正しく実装されているか Rich Results Test で確認
- CMSまたはデータソースの変更により、動的 JSON-LD の出力内容に影響がないか確認
- フレームワーク(Next.js)のバージョンアップ後、
dangerouslySetInnerHTMLの動作に変化がないか確認 - 新しいコンテンツ種別(動画・コース・採用情報など)が追加された場合、対応スキーマを検討
シリーズ完走おめでとうございます
全5章にわたって、JSON-LDの基礎から実装・運用まで学んできました。 ここで学んだ知識は、本シリーズの他のガイドと組み合わせることで、さらに強力なAI検索最適化(AIO/GEO)を実現します。
全5章を通して、AI時代に構造化データを使いこなす技術を学びましょう。
JSON-LD の全章を学び終えたら、
実際に診断してみましょう
5章にわたって学んだ JSON-LD の知識を、あなたの実際のサイトに活かす第一歩として、 AIOGeoScan の無料診断を活用してください。 JSON-LDエラーの検出から、llms.txt・E-E-A-T・AI検索スコアまでを一括で可視化します。
今すぐ自社サイトを無料診断する