AI検索で自社情報が正確に引用されるかどうかは、コンテンツの書き方だけでは決まりません。 「この記事の著者は誰か」「この会社の所在地はどこか」といった事実情報を、機械が読み取れる形式で渡す必要があります。
その形式がJSON-LDです。
HTMLの <script> タグ内にJSON形式で構造化データを記述し、Schema.orgの語彙で意味を定義します。
本記事では、GEO対策でよく使う4つのスキーマタイプの実装パターンを解説します。
JSON-LDの基本構造
JSON-LDは、HTMLの <head> または <body> 内に <script type="application/ld+json"> として記述します。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Example Inc.",
"url": "https://example.com"
}
</script>
@context でSchema.orgの語彙を宣言し、@type でデータの種類を指定します。
既存のHTMLを一切変更せずに構造化データを追加できるのが、Microdataと比べたJSON-LDのメリットです。
パターン1:Article(記事)
ブログ記事に使います。 AIに「この記事のタイトル・著者・公開日・更新日」を正確に伝えます。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "JSON-LDの実装パターン",
"description": "Article・FAQPage・Organizationの実装例を解説します。",
"image": "https://example.com/images/json-ld-guide.png",
"author": {
"@type": "Person",
"name": "山田太郎",
"url": "https://example.com/authors/yamada",
"sameAs": ["https://www.linkedin.com/in/yamada-taro"]
},
"publisher": {
"@type": "Organization",
"name": "Example Inc.",
"logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }
},
"datePublished": "2025-08-08",
"dateModified": "2025-08-08",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/blog/json-ld-patterns"
}
}
</script>
dateModified はAI検索の鮮度判定に影響する可能性があるため、記事を更新したら必ず値を更新してください。
サイトマップの lastmod と一致させるのが望ましいです。
パターン2:FAQPage(よくある質問)
質問と回答のペアを構造化することで、AIが「この質問にはこの回答がある」と認識できます。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "JSON-LDとは何ですか?",
"acceptedAnswer": {
"@type": "Answer",
"text": "JSON-LDは、Linked DataをJSON形式で記述するための仕様です。Schema.orgの語彙と組み合わせてWebページに構造化データを埋め込みます。"
}
},
{
"@type": "Question",
"name": "JSON-LDを入れるとAI検索に表示されやすくなりますか?",
"acceptedAnswer": {
"@type": "Answer",
"text": "構造化データ自体がランキング要因になるわけではありませんが、AIが情報を正確に抽出しやすくなるため、引用の精度向上につながります。"
}
}
]
}
</script>
質問と回答の内容は、ページの可視テキストと一致させてください。 JSON-LDに書いた回答がページ上に存在しない場合、Googleはガイドライン違反として扱います。
パターン3:Organization(企業情報)
企業のコーポレートサイトで使います。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "株式会社Example",
"alternateName": "Example Inc.",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"foundingDate": "2015",
"address": {
"@type": "PostalAddress",
"addressLocality": "渋谷区",
"addressRegion": "東京都",
"addressCountry": "JP"
},
"sameAs": [
"https://twitter.com/example_jp",
"https://www.linkedin.com/company/example"
]
}
</script>
sameAs で外部プロフィールへのリンクを追加すると、AIがこの組織と外部の情報源を紐づけやすくなります。
パターン4:BreadcrumbList(パンくずリスト)
ページの階層構造をAIに伝えます。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "ホーム", "item": "https://example.com" },
{ "@type": "ListItem", "position": 2, "name": "ブログ", "item": "https://example.com/blog" },
{ "@type": "ListItem", "position": 3, "name": "JSON-LDの実装パターン" }
]
}
</script>
Google検索のリッチリザルトにも表示されるため、SEOとGEOの両方に有効です。
フレームワーク別の実装
Next.jsの場合は dangerouslySetInnerHTML で、Astroの場合は set:html でJSON-LDを出力します。
// Next.js App Router — app/blog/[slug]/page.tsx
const jsonLd = { "@context": "https://schema.org", "@type": "Article", headline: post.title };
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
<!-- Astro — src/layouts/BlogPost.astro -->
<script type="application/ld+json" set:html={JSON.stringify(jsonLd)} />
テスト方法
Googleリッチリザルトテスト
https://search.google.com/test/rich-results でURLまたはコードスニペットを入力すると、検出された構造化データとエラーが表示されます。
コマンドラインでの抽出
import json
import requests
from bs4 import BeautifulSoup
def extract_json_ld(url: str) -> list[dict]:
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
scripts = soup.find_all("script", type="application/ld+json")
results = []
for script in scripts:
try:
results.append(json.loads(script.string))
except json.JSONDecodeError as e:
results.append({"error": str(e)})
return results
よくある実装ミス
JSONの構文エラー。 末尾カンマが最も多い原因です。フレームワーク側で JSON.stringify を通せば回避できます。
ページ内容とJSON-LDの不一致。 headline はページのH1と一致させ、datePublished は実際の公開日を正確に反映してください。
canonicalタグが重複していないか。 CMSプラグインとテーマの両方がJSON-LDを出力していないか確認してください。
実装の優先順位
すべてを一度に実装する必要はありません。
- Organization:企業情報の正確な伝達。最初に実装すべきスキーマ
- Article:ブログ記事の著者・公開日の構造化
- FAQPage:質問と回答が多いページ
- BreadcrumbList:サイト階層の明示
まずはOrganizationをトップページに、Articleをすべてのブログ記事に実装してください。
まとめ
JSON-LDは、AIに「読みやすい形式」で情報を渡す手段です。 自然言語よりも構造化データで提供された事実情報のほうが、AIの読み取り精度は高くなります。
実装コストは低く、1記事あたり数十行のJSONを追加するだけです。 まずはGoogleリッチリザルトテストで自社サイトの現状を確認し、不足しているスキーマから順に追加してください。