JSON-LD — формат структурированной разметки, рекомендованный Google. Вставляется в head страницы как тег <script type="application/ld+json"> и содержит JSON-объект со схемой данных по словарю schema.org.
В отличие от microdata и RDFa, JSON-LD не размечает существующий HTML, а лежит отдельно — это удобно поддерживать. Один блок JSON-LD может содержать @graph с несколькими сущностями, связанными через @id.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Что такое canonical", "author": { "@type": "Person", "name": "Никита Вихров" }, "datePublished": "2026-06-04" } </script>
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[...]}
Главная ловушка JSON-LD — рассинхрон с тем, что видит пользователь. Разметка должна описывать контент, который реально есть на странице: цену в Product, текст вопросов в FAQPage, шаги в HowTo. Если в JSON-LD цена 1990, а на странице 2490, или FAQ размечен, но визуально его нет, Google трактует это как разметку-обманку и снимает расширенный сниппет, иногда с ручной санкцией за spammy structured markup. Проверять обязательно в Rich Results Test и отчёте «Улучшения» в Search Console, а у Яндекса — в Вебмастере, раздел «Информация о сайте → Товары и цены / Валидатор микроразметки».
Яндекс и Google читают JSON-LD по-разному. Google опирается на чистый schema.org и даёт за корректную разметку звёзды, цены, хлебные крошки в выдаче. Яндекс часть schema.org понимает (Organization, BreadcrumbList, Product), но для товаров, отзывов и рецептов исторически предпочитает свой формат и микроформаты, поэтому FAQ-разметка, которую снял Google в 2023, у Яндекса так и не давала расширений. Практическое правило: ставьте один блок @graph с Organization и WebSite на всех страницах, BreadcrumbList и тип контента — на конкретных, связывайте сущности через @id, чтобы не плодить дубли. Связь с JavaScript SEO: если JSON-LD дорисовывается скриптом, убедитесь, что он есть в отрендеренном DOM, иначе робот его не увидит.
Блок в head или body, не привязанный к вёрстке — данные лежат как чистый JSON.
@graph объединяет Organization, WebSite, BreadcrumbList; сущности связаны по @id без дублирования.
Google рисует звёзды, цену и крошки в выдаче; данные должны совпадать с видимым контентом, иначе снимут.
Интернет-магазин разметил у 600 карточек Product с offers, но цену подставлял JS после загрузки, а в исходном HTML стоял заглушечный 0. Google в Rich Results Test видел price: 0 и не показывал цену в сниппете, плюс в Search Console висело 600 ошибок «Either offers, review, or aggregateRating should be specified». Перенесли цену в серверный рендер JSON-LD — за 3 недели цены появились в выдаче, CTR