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を出力していないか確認してください。

実装の優先順位

すべてを一度に実装する必要はありません。

  1. Organization:企業情報の正確な伝達。最初に実装すべきスキーマ
  2. Article:ブログ記事の著者・公開日の構造化
  3. FAQPage:質問と回答が多いページ
  4. BreadcrumbList:サイト階層の明示

まずはOrganizationをトップページに、Articleをすべてのブログ記事に実装してください。

まとめ

JSON-LDは、AIに「読みやすい形式」で情報を渡す手段です。 自然言語よりも構造化データで提供された事実情報のほうが、AIの読み取り精度は高くなります。

実装コストは低く、1記事あたり数十行のJSONを追加するだけです。 まずはGoogleリッチリザルトテストで自社サイトの現状を確認し、不足しているスキーマから順に追加してください。