JSON-LD: Kompletny przewodnik po implementacji SEO
Dane strukturalne JSON-LD precyzyjnie informują wyszukiwarki o zawartości strony. Odpowiednie oznaczenia schematu odblokowują rozszerzone wyniki w Google — FAQ, karuzele artykułów, okruszki i inne — bezpośrednio w wynikach wyszukiwania.
Przewodnik obejmuje wszystkie główne typy schematów z rzeczywistym kodem C# i dokładnym JSON-em. Przykłady pochodzą z produkcyjnego kodu Blazor.

Spis treści
Czym jest JSON-LD i dlaczego jest ważny dla SEO
JSON-LD (JavaScript Object Notation for Linked Data) to sposób kodowania danych strukturalnych w formacie JSON. Wyszukiwarki, jak Google, odczytują je, by zrozumieć znaczenie treści, nie tylko słowa kluczowe.
Gdy Google odczyta dane strukturalne, strona może wyświetlać rozszerzone wyniki — wzbogacone wizualnie, z ocenami, FAQ, obrazami artykułów, okruszkami i innymi funkcjami. Takie wyniki mają wyższy współczynnik klikalności niż zwykłe linki.
Google oficjalnie zaleca JSON-LD zamiast Microdata i RDFa, ponieważ można go umieścić w dowolnym miejscu strony — także w sekcji head — bez konieczności zmiany istniejącego HTML. Dane są całkowicie oddzielone od kodu.
Uprawnienia do wyników rozszerzonych
Poprawne oznaczenia schematu umożliwiają wyświetlanie FAQ, karuzel artykułów, okruszków i innych rozszerzonych funkcji w Google.
Więcej kliknięć przy tym samym rankingu
Jasność semantyczna
Dane strukturalne eliminują niejasności. Strona z pytaniami i odpowiedziami jest oznaczona jako FAQPage, dzięki czemu Google wyświetla ją jako rozszerzony wynik FAQ.
Poinformuj wyszukiwarki, co oferujesz
Brak zmian w HTML
JSON-LD umieszczany jest w tagu skryptu w sekcji head. Nie ingeruje w widoczny HTML, więc dodawanie lub aktualizacja schematu nie zagraża układowi ani dostępności.
Czysty podział odpowiedzialności
JSON-LD kontra Microdata i RDFa
Istnieją trzy formaty osadzania danych schema.org na stronach. Google rozumie wszystkie, ale różnią się sposobem stosowania i utrzymania.
| Format | Miejsce składni | Utrzymanie | Wpływ na SEO | Rekomendacja Google |
|---|---|---|---|---|
| JSON-LD | Oddzielny tag skryptu | Łatwe — bez zmian w HTML | Pełne wsparcie wyników rozszerzonych | Zalecane |
| Microdata | Atrybuty w HTML | Wysokie — ściśle powiązane z kodem | Pełne wsparcie wyników rozszerzonych | Obsługiwane |
| RDFa | Atrybuty w HTML | Wysokie — ściśle powiązane z kodem | Pełne wsparcie wyników rozszerzonych | Obsługiwane |
Dlaczego JSON-LD jest łatwiejszy w utrzymaniu
W Microdata i RDFa atrybuty schematu są rozproszone w HTML. Zmiana szablonu może nieoczekiwanie uszkodzić dane. JSON-LD to samodzielny blok — aktualizujesz skrypt, bez wpływu na HTML.
Opanuj nowoczesne tworzenie stron z SEO
Moja wskazówka Ten kurs pomógł mi zrozumieć, jak techniczne SEO, dane strukturalne i nowoczesne standardy webowe współgrają w praktyce.
- Naucz się stosować meta tagi HTML, Open Graph i dane strukturalne JSON-LD.
- Praktyczne strategie SEO dla lepszej widoczności i pozycji w wyszukiwarkach.
- Projekty praktyczne obejmujące responsywny design i optymalizację wydajności.
Podstawowe typy schematów i ich zastosowanie
Schema.org definiuje setki typów, ale kilka obejmuje większość treści. To one odblokowują rozszerzone wyniki w Google.
| Typ schematu | Zastosowanie | Typ wyniku rozszerzonego |
|---|---|---|
| Article | Posty na blogu, poradniki, artykuły | Karuzela artykułów, Najważniejsze wiadomości |
| FAQPage | Strony z pytaniami i odpowiedziami | FAQ w wynikach wyszukiwania |
| BreadcrumbList | Strony z hierarchią nawigacji | Ścieżka okruszków pod adresem URL |
| WebSite / WebPage | Strona główna, strony centralne, landing pages | Pole wyszukiwania i rozpoznawanie encji |
| SoftwareApplication | Aplikacje, narzędzia, oprogramowanie | Rozszerzony wynik aplikacji z oceną i ceną |
Słownik Schema.org
Wszystkie typy schematów są zdefiniowane na schema.org. Właściwość @context w JSON-LD wskazuje parserom słownik schema.org. Można łączyć wiele typów na jednej stronie — Google przetwarza każdy blok osobno.
Implementacja schematu artykułu
Schemat artykułu to najważniejszy typ dla stron z treściami. Informuje Google o tytule, opisie, dacie publikacji, autorze i wydawcy — minimalny zestaw do wyników rozszerzonych.
Poniższa klasa C# to model serializacji. Każde pole odpowiada właściwości JSON-LD przez atrybut 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; }
}Wymagane właściwości to: headline, image, datePublished, dateModified, author i publisher. Tablica articleSection jest opcjonalna, ale zalecana — wskazuje zakres tematyczny artykułu.
<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>Autor i wydawca są typu Organization. W blogach osobistych autor może być Person z nazwą i URL.
Schemat FAQ dla rozszerzonych fragmentów
Schemat FAQPage tworzy rozszerzone wyniki FAQ — rozwijane pytania i odpowiedzi wyświetlane bezpośrednio w wynikach Google pod listingiem strony. Zwiększa to widoczność i CTR.
Klasa FaqPage zawiera listę pytań. Każde musi mieć nazwę (pytanie) i acceptedAnswer z tekstem (odpowiedź).
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; }
}Wynik to pojedynczy blok FAQPage z tablicą mainEntity. Każdy element to Question z acceptedAnswer. Google obsługuje do 10 pytań na stronę.
<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>Właściwość @id w bloku FAQPage wiąże schemat z konkretnym fragmentem URL. To najlepsza praktyka przy wielu blokach schematu na stronie, ułatwiająca identyfikację.
Schemat WebSite i WebPage
Schemat WebSite i WebPage tworzy podstawowy graf encji witryny. WebSite określa witrynę — nazwę, URL, język i wydawcę. WebPage opisuje stronę i łączy ją z WebSite przez isPartOf.
Obie klasy stosują ten sam wzorzec JSON-LD. @id WebSite to domena główna, @id WebPage to pełny URL strony.
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; }
}Właściwość inLanguage używa kodów językowych BCP 47 (np. en, de, fr). Link isPartOf łączy WebPage z WebSite przez @id domeny, co pomaga Google zbudować model encji witryny.
<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>Najlepsze praktyki implementacji
Metoda WrapInScriptTag to jedyne miejsce, gdzie ciągi JSON stają się poprawnymi blokami JSON-LD. Opakowuje schemat w tag script z typem MIME application/ld+json.
To metoda wywoływana przez wszystkie budownicze schematów — Article, FAQPage, BreadcrumbList, WebSite i WebPage przekazują do niej swój 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());
}Obiekt SchemaContext to punkt startowy metody BuildSchema. Zawiera wszystkie dane potrzebne do budowy pełnego zestawu bloków schematu — typ, metadane, FAQ, okruszki i dane artykułu.
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);
}Przełącznik dystrybucji umożliwia komponowanie budowniczego schematu. FAQ i okruszki są zawsze dodawane, niezależnie od typu strony. Każdy typ strony może mieć FAQ lub okruszki bez zmiany logiki.
Testowanie i walidacja schematu
Poprawna składnia JSON-LD nie gwarantuje wyników rozszerzonych. Narzędzia Google sprawdzają składnię i zgodność z polityką dla każdego typu wyniku.
Test wyników rozszerzonych
Użyj search.google.com/test/rich-results, by przetestować URL lub wkleić HTML. Google potwierdza wykryte typy wyników i wskazuje brakujące właściwości.
Oficjalne narzędzie Google do sprawdzania uprawnień
Walidator oznaczeń schematu
validator.schema.org sprawdza oznaczenia względem specyfikacji schema.org niezależnie od polityk Google. Pomocny przy literówkach i niezgodnościach typów.
Walidacja składni Schema.org
Google Search Console
Sekcja Ulepszenia w Search Console raportuje błędy i ostrzeżenia schematu na wielu stronach. Używaj do monitoringu po wdrożeniu.
Monitoruj na dużą skalę po wdrożeniu