Guia Completo de Implementação de JSON-LD para SEO

Última atualização 28/03/2026
Dados estruturados Resultados enriquecidos

Dados estruturados JSON-LD informam aos mecanismos de busca exatamente sobre o seu conteúdo. A marcação correta libera resultados enriquecidos no Google — FAQs, carrosséis de artigos, trilhas de navegação e mais — direto na página de resultados.

Este guia apresenta os principais tipos de schema com código real em C# e o JSON exato gerado. Todos os exemplos vêm de um código Blazor em produção.

Ilustração mostrando dados JSON-LD gerando resultados enriquecidos no Google, incluindo FAQs, carrosséis e navegação breadcrumb
JSON-LD é a forma mais fácil de manter a marcação schema — fica em uma tag script, separada do HTML.

O que é JSON-LD e por que é importante para SEO

JSON-LD (JavaScript Object Notation for Linked Data) é um método de codificar dados estruturados em JSON. Motores de busca como o Google usam esses dados para entender o significado do seu conteúdo, não só as palavras-chave.

Quando o Google interpreta seus dados estruturados, sua página pode exibir resultados enriquecidos — listagens visuais com avaliações, FAQs, imagens, breadcrumbs e mais, aumentando cliques em relação a links comuns.

O Google recomenda JSON-LD em vez de Microdata e RDFa porque pode ser colocado em qualquer parte da página — inclusive no head — sem alterar o HTML existente. Os dados ficam totalmente separados do markup.

Elegibilidade para resultados enriquecidos

Marcação schema válida torna suas páginas elegíveis para FAQs, carrosséis, breadcrumbs e outros recursos no Google Search.

Mais cliques com o mesmo posicionamento

Clareza semântica

Dados estruturados eliminam ambiguidades. Uma página de perguntas e respostas é declarada como FAQPage, para o Google exibir resultado enriquecido de FAQ.

Informe aos buscadores exatamente o que você tem

Sem alterações no HTML

JSON-LD fica em uma tag script no head, sem tocar no HTML visível, evitando riscos de quebrar o layout ou acessibilidade.

Separação clara de responsabilidades

JSON-LD vs. Microdata vs. RDFa

Existem três formatos para inserir dados schema.org em páginas web. Todos são reconhecidos pelo Google, mas diferem na aplicação e manutenção.

Formato Local da sintaxe Manutenção Impacto no SEO Recomendação do Google
JSON-LD Tag script separada Fácil — sem alterações no HTML Suporte completo a resultados enriquecidos Recomendado
Microdata Atributos inline no HTML Alto — fortemente ligado ao markup Suporte completo a resultados enriquecidos Suportado
RDFa Atributos inline no HTML Alto — fortemente ligado ao markup Suporte completo a resultados enriquecidos Suportado

Por que JSON-LD é mais fácil de manter

Com Microdata e RDFa, atributos schema ficam espalhados no HTML. Mudanças no design podem quebrar os dados. JSON-LD é um bloco único — atualize o script e o HTML não é afetado.

Escolha de aprendizado em Desenvolvimento Web

Domine Desenvolvimento Web moderno com SEO eficaz

Dica minha Achei este curso valioso para entender como SEO técnico, dados estruturados e padrões web modernos funcionam juntos em projetos reais.

  • Aprenda a implementar meta tags HTML, Open Graph e dados estruturados JSON-LD.
  • Estratégias práticas de SEO para melhorar visibilidade e ranking nos buscadores.
  • Projetos práticos sobre design responsivo e otimização de desempenho.
Explore o curso de Desenvolvimento Web

Principais tipos de schema e quando usar

Schema.org define centenas de tipos, mas poucos cobrem a maior parte do conteúdo web. São esses que liberam resultados enriquecidos no Google.

Tipo de schema Caso de uso Tipo de resultado enriquecido
Article Posts, guias, notícias Carrossel de artigos, principais notícias
FAQPage Páginas com perguntas e respostas FAQ expansível nos resultados
BreadcrumbList Qualquer página com hierarquia de navegação Trilha breadcrumb abaixo da URL
WebSite / WebPage Página inicial, hubs, landing pages Caixa de busca de sitelinks, reconhecimento de entidade
SoftwareApplication Apps, ferramentas, softwares Resultado enriquecido de app com avaliação e preço

Vocabulário Schema.org

Todos os tipos de schema estão definidos em schema.org. A propriedade @context em cada bloco JSON-LD orienta o parser a usar esse vocabulário. Você pode combinar vários schemas na mesma página — o Google processa cada bloco separadamente.

Implementação do schema de artigo

O schema de artigo é o mais importante para sites de conteúdo. Informa ao Google título, descrição, data, autor e editor — o mínimo para resultados enriquecidos.

A classe C# abaixo é o modelo de serialização. Cada propriedade corresponde ao campo JSON-LD via atributos JsonPropertyName.

C#Classe C# ArticleSchema (JsonLdService.cs)
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; }
}

As propriedades obrigatórias são: headline, image, datePublished, dateModified, author e publisher. O array articleSection é opcional, mas recomendado — indica o escopo do artigo para o Google.

HTMLSaída JSON-LD do schema de artigo
<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 e editor são do tipo Organization. Para blogs pessoais, o autor pode ser Person com nome e URL.

Schema FAQ para snippets enriquecidos

O schema FAQPage cria resultados FAQ — perguntas e respostas expansíveis exibidas diretamente nos resultados do Google, aumentando visibilidade e cliques.

A classe FaqPage contém uma lista de perguntas. Cada uma deve ter um nome (pergunta) e uma acceptedAnswer com texto (resposta).

C#Classe C# FaqPage (JsonLdService.cs)
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; }
}

A saída é um bloco FAQPage com um array mainEntity. Cada item é do tipo Question com acceptedAnswer. O Google suporta até dez perguntas por página.

HTMLSaída JSON-LD do schema FAQ
<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>

O @id no bloco FAQPage vincula o schema a um fragmento de URL específico. É boa prática para páginas com múltiplos schemas, facilitando a identificação.

Schema WebSite e WebPage

Schemas WebSite e WebPage formam o grafo de entidades do site. WebSite identifica o site — nome, URL, idioma e editor. WebPage descreve a página e a vincula ao WebSite via isPartOf.

Ambas as classes seguem o mesmo padrão JSON-LD. O @id do WebSite é a raiz do domínio; o do WebPage é a URL completa da página.

C#Classes C# WebSiteSchema e WebPageSchema (JsonLdService.cs)
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; }
}

A propriedade inLanguage usa códigos BCP 47 (ex: en, de, fr). O link isPartOf conecta o WebPage ao WebSite pelo @id do domínio, ajudando o Google a montar o modelo completo do site.

HTMLSaída JSON-LD dos schemas WebSite e WebPage
<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>

Melhores práticas de implementação

O método WrapInScriptTag é o ponto único onde strings JSON viram blocos JSON-LD válidos. Ele envolve o schema serializado na tag script com MIME application/ld+json.

Este método é chamado por todos os construtores de schema no serviço — Article, FAQPage, BreadcrumbList, WebSite e WebPage enviam seu JSON serializado para esta utilidade.

C#Método WrapInScriptTag (JsonLdService.cs)
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());
}

O objeto SchemaContext é a entrada para o método BuildSchema. Ele carrega todos os dados para construir o conjunto completo de schemas da página — tipo, metadados, FAQs, breadcrumbs e dados do artigo.

C#Lógica de despacho BuildSchema (JsonLdService.cs)
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);
}

O switch de despacho torna o construtor de schema componível. FAQs e breadcrumbs são sempre adicionados se existirem, independente do tipo de página. Assim, qualquer página pode ter FAQ ou breadcrumb sem alterar a lógica principal.

Testando e validando seu schema

Sintaxe JSON-LD válida não garante elegibilidade para resultados enriquecidos. As ferramentas do Google verificam sintaxe e conformidade com políticas para cada tipo de resultado.

Teste de Resultados Enriquecidos

Use search.google.com/test/rich-results para testar URLs ou colar HTML. O Google confirma os tipos de resultados detectados e aponta propriedades obrigatórias faltantes.

Validador oficial de elegibilidade do Google

Validador de Marcação Schema

validator.schema.org verifica seu markup contra a especificação schema.org, independente das políticas do Google. Útil para detectar erros de nomes e tipos.

Validação de sintaxe schema.org

Google Search Console

A seção Melhorias no Search Console reporta erros e avisos de schema em larga escala nas páginas indexadas. Use para monitoramento contínuo após validação inicial.

Monitorar em larga escala após lançamento

Perguntas frequentes

Respostas às dúvidas comuns sobre marcação JSON-LD