JSON-LD разметка схемы: Полное руководство по SEO
JSON-LD структурированные данные точно сообщают поисковым системам содержание вашего контента. Правильная разметка схемы открывает расширенные результаты в Google — выпадающие FAQ, карусели статей, хлебные крошки и другое — прямо на странице поиска.
В этом руководстве рассмотрены все основные типы схем с реальным кодом на C# и точным JSON-выводом. Все примеры взяты из рабочего кода Blazor.

Содержание
Что такое JSON-LD и почему это важно для SEO
JSON-LD (JavaScript Object Notation for Linked Data) — метод кодирования структурированных данных в формате JSON. Поисковые системы, такие как Google, читают эти данные, чтобы понять смысл вашего контента, а не только ключевые слова.
Когда Google может распознать ваши структурированные данные, страница становится кандидатом на расширенные результаты — визуально улучшенные списки с рейтингами, FAQ, изображениями статей, хлебными крошками и другими функциями прямо в результатах поиска. Такие результаты получают больше кликов, чем обычные ссылки.
Google официально рекомендует JSON-LD вместо Microdata и RDFa, так как его можно разместить в любом месте страницы, включая <head>, без изменения существующих HTML-элементов. Структурированные данные полностью отделены от разметки.
Право на расширенные результаты
Корректная разметка схемы делает ваши страницы подходящими для FAQ, каруселей статей, хлебных крошек и других расширенных функций в Google Search.
Больше кликов при том же ранжировании
Семантическая ясность
Структурированные данные устраняют неоднозначность. Страница с вопросами и ответами явно объявлена как FAQPage, чтобы Google отображал её как расширенный результат FAQ.
Точно сообщите поисковикам, что у вас есть
Без изменений HTML
JSON-LD размещается в скрипте в <head>. Он не влияет на визуальный HTML, поэтому добавление или обновление схемы не нарушит верстку или доступность.
Чёткое разделение ответственности
JSON-LD против Microdata и RDFa
Существует три формата для внедрения структурированных данных schema.org на веб-страницы. Все они поддерживаются Google, но существенно отличаются по способу применения и сопровождения.
| Формат | Расположение синтаксиса | Поддержка | Влияние на SEO | Рекомендация Google |
|---|---|---|---|---|
| JSON-LD | Отдельный скрипт | Просто — без изменений HTML | Полная поддержка расширенных результатов | Рекомендуется |
| Microdata | Атрибуты в HTML | Высокая — тесно связана с разметкой | Полная поддержка расширенных результатов | Поддерживается |
| RDFa | Атрибуты в HTML | Высокая — тесно связана с разметкой | Полная поддержка расширенных результатов | Поддерживается |
Почему JSON-LD лучше для поддержки
В Microdata и RDFa атрибуты схемы разбросаны по всему HTML. Изменение шаблона может незаметно сломать данные. JSON-LD — автономный блок, обновите скрипт — HTML не затрагивается.
Основные типы схем и когда их применять
Schema.org определяет сотни типов, но несколько покрывают большую часть веб-контента. Именно они открывают расширенные результаты в Google Search.
| Тип схемы | Сценарий использования | Тип расширенного результата |
|---|---|---|
| Article | Блоги, руководства, новости | Карусель статей, главные новости |
| FAQPage | Страницы с вопросами и ответами | Выпадающий FAQ в результатах поиска |
| BreadcrumbList | Любая страница с навигационной иерархией | Хлебные крошки под URL |
| WebSite / WebPage | Главная, хабы, лендинги | Поиск по сайту, распознавание сущностей |
| SoftwareApplication | Приложения, инструменты, ПО | Расширенный результат приложения с рейтингом и ценой |
Словарь Schema.org
Все типы схем определены на schema.org. Свойство @context в каждом JSON-LD блоке указывает парсерам использовать словарь schema.org. Несколько типов схем можно комбинировать на одной странице — Google обрабатывает каждый скрипт отдельно.
Реализация схемы статьи
Схема статьи — самый важный тип для контентных сайтов. Она сообщает Google заголовок, описание, дату публикации, автора и издателя — минимальный набор для расширенных результатов.
Ниже класс C# — модель сериализации. Каждое свойство напрямую соответствует полю JSON-LD с атрибутами JsonPropertyName.
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>Автор и издатель имеют тип Organization. Для личных блогов автор может быть Person с именем и URL.
Схема FAQ для расширенных сниппетов
Схема FAQPage создаёт расширенные результаты FAQ — раскрывающиеся пары вопросов и ответов, отображаемые прямо в результатах Google под вашей страницей. Это значительно увеличивает занимаемое место, улучшая видимость и кликабельность.
Класс FaqPage содержит список вопросов. Каждый вопрос должен иметь имя (вопрос) и 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; }
}Вывод — один блок FAQPage с массивом mainEntity. Каждый элемент — тип Question с acceptedAnswer. Google поддерживает до десяти вопросов на странице для расширенных результатов.
<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>@id в блоке FAQPage привязывает схему к конкретному фрагменту URL. Это лучшая практика для страниц с несколькими блоками схем, позволяя парсерам однозначно идентифицировать каждую сущность.
Схемы WebSite и WebPage
Схемы WebSite и WebPage создают базовую модель сущностей сайта. WebSite описывает сам сайт — имя, URL, язык и издателя. WebPage описывает отдельную страницу и связывает её с WebSite через isPartOf.
Оба класса используют одинаковый JSON-LD шаблон. @id у WebSite — корень домена; @id у WebPage — полный 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 блоки. Он оборачивает сериализованные данные в скрипт с MIME типом application/ld+json.
Этот метод вызывают все строители схем в сервисе — 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);
}Переключатель dispatch делает построитель схем модульным. FAQ и хлебные крошки всегда добавляются, если есть, независимо от типа страницы. Это позволяет добавлять FAQ или хлебные крошки на любую страницу без изменения основной логики.
Тестирование и проверка вашей схемы
Корректный синтаксис JSON-LD не гарантирует право на расширенные результаты. Инструменты Google проверяют синтаксис и соответствие контента требованиям политики для каждого типа расширенных результатов.
Тест расширенных результатов
Используйте search.google.com/test/rich-results для проверки любого URL или вставьте HTML. Google покажет обнаруженные типы расширенных результатов и укажет отсутствующие обязательные свойства.
Официальный проверщик соответствия Google
Валидатор разметки схемы
validator.schema.org проверяет вашу разметку по спецификации schema.org независимо от правил Google для расширенных результатов. Полезно для поиска опечаток и несоответствий типов.
Проверка синтаксиса Schema.org
Google Search Console
Раздел «Улучшения» в Search Console показывает ошибки и предупреждения схемы по всем индексированным страницам. Используйте для постоянного мониторинга после первичной проверки.
Масштабный мониторинг после запуска