JSON-LD e SEO

JSON-LD è il formato di dati strutturati basato su script che Google raccomanda — il più facile da implementare, non tocca mai l'HTML visibile, e tipicamente si abbina a schema.org per la SEO.

Prima pubblicazione: 26 giu 2026 · Ultimo aggiornamento: 13 ago 2026 · Advanced
Lingue
1 segnale di evidenza in questa pagina

JSON-LD è un formato di dati strutturati che vive in un tag <script type="application/ld+json">; dal lato SEO è tipicamente abbinato al vocabolario schema.org per descrivere il contenuto della pagina, sebbene possa trasportare anche altri vocabolari. È uno standard W3C dal 2014 e Google lo raccomanda rispetto a Microdata e RDFa perché è più facile da implementare e mantenere su larga scala: risiede in un blocco separato e non modifica l'HTML visibile. Tutti e tre i formati funzionano ugualmente bene se implementati correttamente. La struttura sintattica ruota attorno a @context (il vocabolario — schema.org per la maggior parte del markup SEO, ma non l'unico valore valido), @type (l'entità) e @id (un URI stabile, utile ma facoltativo, per collegare entità — alla base dello schema @graph, che è uno dei modi validi per organizzare più entità, non un requisito). Googlebot esegue JavaScript, quindi il JSON-LD inserito dinamicamente funziona per Google; diversi crawler IA, tra cui GPTBot e ClaudeBot nei test citati, non hanno eseguito JavaScript. Poiché questo comportamento dipende dal fornitore e dalla data, occorre verificare il crawler rilevante e renderizzare lato server il markup quando non è possibile confermarne l'esecuzione. I dati strutturati non sono un segnale di ranking: determinano l'idoneità ai risultati avanzati e aiutano a comprendere le entità, ma devono descrivere contenuti effettivamente visibili sulla pagina.

TL;DR — JSON-LD è una raccomandazione W3C del 2014: usa la sintassi JSON, mentre @context gli consente di esprimere dati collegati. Google raccomanda questo formato di dati strutturati perché è facile da implementare e mantenere su larga scala e non modifica l’HTML visibile; Microdata e RDFa sono ugualmente validi quando corretti. La struttura sintattica comprende @context (il vocabolario — di norma schema.org per il markup SEO, anche se la specifica consente altri contesti), @type (l’entità) e @id (un URI stabile, utile ma facoltativo, per i riferimenti incrociati tra entità — alla base di @graph, uno schema valido tra altri, non un requisito). Puoi inserirlo in <head> o <body>: Google accetta entrambi. Googlebot esegue JavaScript, quindi il JSON-LD inserito dinamicamente funziona per Google; diversi crawler IA, tra cui GPTBot e ClaudeBot nei test citati, non lo hanno eseguito. Poiché il comportamento dipende dal fornitore e dalla data, verifica il crawler pertinente e renderizza lato server ciò che non puoi confermare. I dati strutturati non sono un segnale di ranking: determinano l’idoneità ai risultati avanzati e aiutano a comprendere le entità, ma devono descrivere contenuti visibili sulla pagina.

JSON-LD è un formato, non un vocabolario

Prima di tutto, una distinzione che chiarisce molta confusione: JSON-LD è il formato; schema.org è il vocabolario. JSON-LD è come scrivi il markup; i tipi Article, Product, Organization di schema.org sono cosa dici. I rich result sono il livello di funzionalità sopra entrambi. Questa pagina riguarda il formato. (L’angolazione del vocabolario per l’AI vive in Schema Markup for AI.)

JSON-LD è una raccomandazione W3C, pubblicata per la prima volta nel 2014 — precede la sua adozione SEO ed è stato progettato per l’interoperabilità generale dei linked data sul web, non specificamente per la ricerca. Questa storia è il motivo per cui esiste una proprietà come @id, ed è il punto a livello di specifica che la maggior parte delle guide SEO salta: JSON-LD non è solo JSON. È costruito sulla sintassi JSON, ma la dichiarazione @context è ciò che rende i dati collegati — identificabili e collegabili attraverso il web. Rimuovi @context e hai dati che un parser non può interpretare.

JSON-LD non è nemmeno legato a schema.org. La specifica consente a @context di fare riferimento a qualsiasi vocabolario pubblicato — i suoi stessi esempi collegano a contesti non schema.org — quindi JSON-LD è la risposta giusta a “quale formato” mentre schema.org è una risposta, quella comune per il markup di ricerca e AI-search, a “quale vocabolario.” Una pagina potrebbe validamente usare JSON-LD con un vocabolario diverso; semplicemente non sarebbe più markup schema.org.

Confronto tra JSON-LD, Microdata e RDFa

Ci sono tre modi per esprimere dati strutturati, e Google li supporta tutti:

JSON-LDMicrodataRDFa
Dove viveUn blocco <script> separatoAttributi itemprop inline sul tuo HTMLAttributi property inline sul tuo HTML
Tocca l’HTML visibile?No
Può essere iniettato da JS / tag manager?Sì (pulitamente)ScomodoScomodo
Posizione di GoogleRaccomandatoSupportatoSupportato
Propensione agli erroriMinimaAlta (intrecciata con il markup)Alta (intrecciata con il markup)

La raccomandazione di Google è esplicita ma di portata limitata: “In general, Google recommends using JSON-LD for structured data if your site’s setup allows it, as it’s the easiest solution for website owners to implement and maintain at scale (in other words, less prone to user errors).” (traduzione) «In generale, Google raccomanda di usare JSON-LD per i dati strutturati se la configurazione del tuo sito lo consente, poiché è la soluzione più semplice per i proprietari di siti web da implementare e mantenere su larga scala (in altre parole, meno soggetta a errori degli utenti).»

La sfumatura che i concorrenti di solito tralasciano — e quella che vale la pena mantenere — proviene dalla stessa pagina di Google: “All 3 formats are equally fine for Google, as long as the markup is valid and properly implemented per the feature’s documentation.” (traduzione) «Tutti e 3 i formati vanno ugualmente bene per Google, purché il markup sia valido e implementato correttamente secondo la documentazione della funzionalità.» Quindi la raccomandazione riguarda la facilità di implementazione e il tasso di errore, non la velocità di parsing o un vantaggio di ranking. Usare Microdata non è una penalità. JSON-LD vince solo in pratica perché non intreccia i dati strutturati con il markup che un designer potrebbe modificare domani.

La sintassi: @context, @type, @id, proprietà, annidamento

Ecco un blocco Article annotato:

<script type="application/ld+json">
{
  "@context": "https://schema.org",          // the vocabulary — the common value for SEO
  "@type": "Article",                          // the entity type
  "@id": "https://example.com/post#article",   // a stable URI for this entity
  "headline": "How JSON-LD Works",            // a property (key/value)
  "datePublished": "2026-06-26",
  "author": {                                  // a nested entity
    "@type": "Person",
    "name": "Patrick Stox",
    "url": "https://patrickstox.com/"
  }
}
</script>
  • @context — stabilisce il quadro semantico (il vocabolario). Per il markup SEO di schema.org è tipicamente "https://schema.org", ma è una convenzione, non una regola: @context mappa i termini agli identificatori e la specifica consente di puntare ad altri vocabolari. Dice al parser come interpretare ogni nome di proprietà che segue. Questa è la parte che lo rende dato collegato.
  • @type — dichiara l’entità: Article, Product, Organization, BreadcrumbList, ecc. Si mappa a un tipo di schema.org. Usa il tipo applicabile più specificoNewsArticle invece di Article se si adatta.
  • @id — un URI univoco che identifica la risorsa. È il meccanismo che ti consente di fare riferimento a un’entità da un’altra (vedi @graph sotto) e vale la pena impostarlo su qualsiasi cosa a cui farai riferimento incrociato — ma non è universalmente richiesto. La specifica JSON-LD consente nodi vuoti non identificati, quindi un JSON-LD valido può omettere @id su entità a cui non devi mai fare riferimento altrove.
  • Proprietà — normali coppie chiave/valore JSON, che usano termini del vocabolario dal @context.
  • Annidamento — le entità figlie sono espresse come oggetti JSON annidati (l’oggetto author sopra) o array di oggetti.

Il pattern @graph (l’approccio scalabile)

La maggior parte delle pagine necessita di più di un’entità: un’Organization, un WebSite, una BreadcrumbList e l’Article o WebPage stesso. L’approccio ingenuo è quattro blocchi <script> separati che ripetono i dati. Un’alternativa scalabile è un singolo blocco con @graph — un array di entità, con riferimenti incrociati tramite @id. Né la specifica JSON-LD né Google impongono @graph come il pattern — è sintassi per esprimere un grafo, e esistono altri layout validi (blocchi tipizzati separati, oggetti annidati senza un @graph di livello superiore, nodi vuoti senza alcun @id) — ma su un sito con diverse entità con riferimenti incrociati, è il pattern che evita di ripetere gli stessi dati di Organization o WebSite su ogni pagina:

Declare each entity once and connect the graph with stable `@id` references instead of repeating full objects. Fonte: Nested Schema

One Organization is referenced as publisher by the WebSite and Article. The WebPage belongs to the WebSite and is connected to the Article. Each entity is declared once, and the same stable ID string is reused for every reference.

© Patrick Stox LLC · CC BY 4.0 ·

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://example.com/#org",
      "name": "Example Co",
      "url": "https://example.com/"
    },
    {
      "@type": "WebSite",
      "@id": "https://example.com/#website",
      "url": "https://example.com/",
      "publisher": { "@id": "https://example.com/#org" }   // reference, not a copy
    },
    {
      "@type": "WebPage",
      "@id": "https://example.com/post#webpage",
      "isPartOf": { "@id": "https://example.com/#website" },
      "breadcrumb": { "@id": "https://example.com/post#breadcrumb" }
    }
  ]
}
</script>

Definisci Organization una volta, poi punta ad essa con { "@id": "...#org" } ovunque altro invece di ripetere nome, logo e URL. È così che i principali plugin schema dei CMS costruiscono il loro output, ed è il motivo per cui esiste @id. Bing fa lo stesso ragionamento per l’annidamento di JSON-LD: “makes defining links and relationships between data and entities… easy because it supports nested data.” (traduzione) «rende facile definire collegamenti e relazioni tra dati ed entità… perché supporta dati annidati.»

Dove posizionarlo: <head> o <body>

Google conferma che entrambi funzionano“You can put the JSON-LD data in the <head> or the <body> of the page.” (traduzione) «Puoi mettere i dati JSON-LD nella <head> o nel <body> della pagina.» <head> è convenzionale, ma molti plugin CMS lo iniettano vicino alla fine del <body>, e va bene. Bing concorda che può stare “in the header, body or foot of the page.” (traduzione) «nella testata, nel corpo o nel piè di pagina.» Non perdere tempo a spostare un blocco valido dal body alla head; non cambia nulla. Evidence for this claim Google permits JSON-LD in either the head or body of an HTML document for supported structured-data features. Scope: Google Search JSON-LD guidance; markup must still match visible page content. Confidence: high · Verified: Google: Structured data introduction

Generare JSON-LD dinamicamente — e l’inghippo del crawler AI

Puoi costruire JSON-LD al volo con JavaScript, e Google documenta due modi per farlo:

Evidence for this claim Dynamically generated structured data is acceptable to Google when it is rendered and complies with content and quality guidelines. Scope: Google Search JavaScript and structured-data guidance; crawlability and rendering remain prerequisites. Confidence: high · Verified: Google: Generate structured data with JavaScript
  1. Google Tag Manager — un tag HTML personalizzato contenente il JSON-LD, che recupera i valori dalle variabili GTM. (Evita di duplicare i dati tra la pagina e il tag.)
  2. JavaScript personalizzato — crea l’elemento script in modo programmatico:
    const script = document.createElement('script');
    script.setAttribute('type', 'application/ld+json');
    script.textContent = structuredDataText;
    document.head.appendChild(script);

Questo funziona per Googlebot, perché Google esegue il rendering della pagina: “Google Search can understand and process structured data that’s available in the DOM when it renders the page.” (traduzione) «Google Search può comprendere ed elaborare i dati strutturati disponibili nel DOM quando esegue il rendering della pagina.» Fin qui, tutto bene.

Ecco il punto che la maggior parte delle guide tralascia, detto con cautela. Diversi crawler IA — tra cui GPTBot e ClaudeBot nei test citati — non hanno eseguito JavaScript. Se il tuo JSON-LD esiste solo dopo l’esecuzione di uno script lato client, un crawler che salta JavaScript non lo vede mai — è invisibile per quel bot anche se Googlebot lo legge perfettamente, perché Google documenta il rendering del DOM prima di cercare i dati strutturati.

Due avvertenze oneste su quel comportamento dei crawler AI: è la documentazione di Google stessa a stabilire il lato Googlebot; il lato crawler AI deriva da test e segnalazioni su singoli provider, non da una specifica pubblicata da alcuno di essi, quindi è specifica per provider e data — il supporto JavaScript di un crawler può cambiare, e io non ho verificato direttamente ogni provider. Non trattare “i crawler AI saltano JavaScript” come una regola universale su cui costruire; trattalo come un motivo per verificare il crawler che ti interessa davvero (o per ripiegare sul rendering lato server quando non puoi verificare). Se non è nell’HTML renderizzato lato server e non hai confermato che il crawler esegua JavaScript, presupponi che non possa vederlo. Per la visibilità nella ricerca AI, esegui il rendering del JSON-LD lato server nell’HTML statico a meno che tu non abbia verificato diversamente. (Questo è il problema del rendering JavaScript da una prospettiva di dati strutturati — vedi JavaScript SEO.)

C’è una seconda avvertenza per l’ecommerce: Google avverte che il markup Product generato dinamicamente “can make Shopping crawls less frequent and less reliable,” (traduzione) «può rendere le scansioni di Shopping meno frequenti e meno affidabili,» che è un problema reale per prezzi e disponibilità in rapido cambiamento. Per i prodotti, preferisci il rendering lato server indipendentemente dall’AI.

Le policy (ora hanno mordente)

Le linee guida sui dati strutturati di Google sono brevi e fondamentali:

  • “Don’t mark up content that is not visible to readers of the page.” (traduzione) «Non applicare markup a contenuti che non sono visibili ai lettori della pagina.»
  • “Don’t mark up irrelevant or misleading content, such as fake reviews.” (traduzione) «Non applicare markup a contenuti irrilevanti o fuorvianti, come recensioni false.»
  • “Put the structured data on the page that it describes.” (traduzione) «Inserisci i dati strutturati nella pagina che descrivono.»
  • “Use the most specific applicable type and property names defined by schema.org.” (traduzione) «Usa il tipo applicabile più specifico e i nomi delle proprietà definiti da schema.org.»
  • Non bloccare le tue pagine con dati strutturati da Googlebot tramite robots.txt o noindex.

La regola del contenuto visibile è quella da interiorizzare. Lo schema che descrive contenuti non mostrati sulla pagina è sempre stato una violazione; l’applicazione dello schema “invisibile” si è inasprite. Bing lo dice senza mezzi termini: “even though the markup is not visible on your page, it is still read by the search engines, and putting spam data in the markup can hamper your presence.” (traduzione) «anche se il markup non è visibile sulla tua pagina, viene comunque letto dai motori di ricerca, e inserire dati spam nel markup può ostacolare la tua presenza.»

Errori comuni nel JSON-LD

  • Markup che non corrisponde alla pagina visibile — il problema politico n. 1 (una valutazione nel JSON-LD che nessun visitatore vede).
  • JSON malformato — una virgola finale, una virgoletta non escapata o virgolette intelligenti di Word (" invece di ") che rompono silenziosamente l’intero blocco. JSON-LD è rigoroso.
  • Nomi di proprietà errati — inventare proprietà che non sono in schema.org, o scrivere male quelle reali, così il parser le ignora.
  • Un tipo generico dove ne esiste uno specificoThing o Article dove Recipe o NewsArticle erano appropriati.
  • Blocchi Organization duplicati e incoerenti tra pagine con nomi/loghi in conflitto.
  • Proprietà richieste mancanti per il rich result che stai mirando (ogni funzionalità elenca i propri campi obbligatori).
  • Markup iniettato via JS assunto come visibile a ogni crawler — Google lo renderizza, ma alcuni crawler AI non lo hanno fatto, e vale la pena verificarlo per ogni crawler (il problema sopra).

Validazione di JSON-LD

Quattro domande diverse vengono poste sotto “il mio JSON-LD è valido”, e non sono la stessa domanda — superarne una non supera le altre:

TestDimostraNon dimostra
Il JSON viene parsato (qualsiasi linter JSON, o il passaggio di parsing del Rich Results Test)La sintassi è JSON valido — niente virgole finali, virgolette non escapate o rotture da virgolette intelligentiChe qualsiasi nome di proprietà sia vocabolario reale di schema.org, o che Google mostrerà qualcosa
Schema.org ValidatorLe proprietà e i tipi esistono nel vocabolario di schema.orgChe Google supporti il tipo come rich result, o che i campi obbligatori per una funzionalità specifica siano presenti
Rich Results TestIl markup soddisfa i requisiti di Google per un tipo di rich result specifico e supportato, sulla pagina renderizzata che hai testatoChe Google effettivamente mostrerà il rich result — l’idoneità non è una garanzia — o che altri sistemi di ricerca/AI lo parsano allo stesso modo
Google Search Console — Rapporti su Miglioramenti / rich resultCosa Google ha effettivamente parsato su pagine live e crawlizzate, su larga scala, con errori realiStato in tempo reale — i rapporti sono in ritardo rispetto a una nuova crawlizzazione
  • Testa per URL, non con codice incollato, per pagine renderizzate via JS. La modalità di input del codice del Rich Results Test non esegue i tuoi script né risolve i riferimenti relativi come fa il test con URL live — non può dirti come appare un blocco iniettato lato client dopo la renderizzazione.
  • Bing Webmaster Tools — Markup Validator — Bing ha validato JSON-LD da agosto 2018.
  • Nessuno di questi test parla per i crawler che non renderizzano JavaScript (vedi l’avvertenza sui crawler AI sopra) — testare l’URL renderizzato conferma cosa vede Google, non cosa riceve un bot che salta JS.

JSON-LD aiuta la SEO?

Imposta le aspettative onestamente:

  • Non è un segnale di ranking. John Mueller ha detto che i dati strutturati non faranno classificare meglio un sito. Punto.
  • Idoneità per i rich result. È ciò che ti rende idoneo per funzionalità SERP avanzate (stelle, prezzi, FAQ, breadcrumb) — idoneità, non una garanzia.
  • CTR, indirettamente. Risultati dall’aspetto più ricco possono ottenere più clic, che è il vero guadagno per la maggior parte dei siti.
  • Comprensione delle entità. Aiuta i motori a collegare la tua pagina a entità note e al Knowledge Graph.
  • Ricerca AI. Fabrice Canel (Bing) ha confermato nel 2025 che il markup schema aiuta gli LLM di Microsoft a comprendere i contenuti — ma nota l’avvertenza dello studio controllato in Schema Markup for AI: è infrastruttura per la disambiguazione, non una leva diretta per le citazioni.

Quindi: implementa JSON-LD per l’idoneità ai rich result, la chiarezza delle entità e la comprensione AI/LLM — non come un trucco per il ranking.

Questo articolo fa parte dell’hub structured data. Per l’approccio specifico all’IA sul vocabolario schema.org, vedi Schema Markup for AI; per i meccanismi di rendering dietro l’iniezione dinamica, vedi JavaScript SEO.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.