{"id":15738,"date":"2026-09-06T11:22:47","date_gmt":"2026-09-06T09:22:47","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/live-json-ld-structured-data-validator\/"},"modified":"2026-09-06T11:22:47","modified_gmt":"2026-09-06T09:22:47","slug":"live-json-ld-structured-data-validator","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/","title":{"rendered":"Strukturdaten-Pr\u00fcfer f\u00fcr JSON-LD: was eine Seite tats\u00e4chlich \u00fcber sich erkl\u00e4rt"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Strukturdaten sind eine Zusage in einer Sprache, die niemand von Hand liest. Ein einziges fehlendes Komma macht aus dem ganzen Block nichts; eine relative Bildadresse macht daraus eine Zusage, die sich nicht einl\u00f6sen l\u00e4sst. Diese Pr\u00fcfung zieht jeden ld+json-Block aus der ausgelieferten Seite und liest die Knoten einzeln nach, gegen die Felder, die Suchmaschinen je Typ erwarten.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"sd-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Seitenadresse<\/label><br \/>\n        <input id=\"sd-url\" type=\"text\" value=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Von diesem Server: genau eine Anfrage f\u00fcr die Seite, mit 1,5-MB-Bremse. Es wird nichts ausgef\u00fchrt, es werden keine Cookies gesendet und nichts gespeichert au\u00dfer dem Z\u00e4hlerstand.<\/p>\n<p>    <button id=\"sd-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Strukturdaten pr\u00fcfen<\/button><\/p>\n<div id=\"sd-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Grenzen, die zu kennen sich lohnt: Gelesen wird nur JSON-LD im ausgelieferten HTML. Microdata und RDFa nicht \u2014 sie stecken verstreut im Markup und w\u00e4ren ein zweites Werkzeug. Bl\u00f6cke, die ein Skript sp\u00e4ter einf\u00fcgt, bleiben unsichtbar, und die Pflichtfelder stammen aus dem, was Suchmaschinen heute verlangen; das \u00e4ndert sich.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Strukturdaten sind eine Zusage in einer Sprache, die niemand von Hand liest. Ein einziges fehlendes Komma macht aus dem ganzen Block nichts; eine relative Bildadresse macht daraus eine Zusage, die sich nicht einl\u00f6sen l\u00e4sst. Diese Pr\u00fcfung zieht jeden ld+json-Block aus der ausgelieferten Seite und liest die Knoten einzeln nach, gegen die Felder, die Suchmaschinen je Typ erwarten.\",\"label_url\":\"Seitenadresse\",\"datenschutz\":\"Von diesem Server: genau eine Anfrage f\u00fcr die Seite, mit 1,5-MB-Bremse. Es wird nichts ausgef\u00fchrt, es werden keine Cookies gesendet und nichts gespeichert au\u00dfer dem Z\u00e4hlerstand.\",\"knopf\":\"Strukturdaten pr\u00fcfen\",\"laeuft\":\"Seite wird geholt...\",\"grenze\":\"Grenzen, die zu kennen sich lohnt: Gelesen wird nur JSON-LD im ausgelieferten HTML. Microdata und RDFa nicht \u2014 sie stecken verstreut im Markup und w\u00e4ren ein zweites Werkzeug. Bl\u00f6cke, die ein Skript sp\u00e4ter einf\u00fcgt, bleiben unsichtbar, und die Pflichtfelder stammen aus dem, was Suchmaschinen heute verlangen; das \u00e4ndert sich.\",\"h_knoten\":\"Gefundene Knoten\",\"tabelle_hinweis\":\"Gez\u00e4hlt wird nach dem Ausklappen von Feldern und @graph \u2014 so tr\u00e4gt ein einzelner Block meist einen ganzen Satz. Felder ist die Zahl der Schl\u00fcssel im Knoten, ein grobes Ma\u00df daf\u00fcr, wie viel er sagt.\",\"h_befunde\":\"Befunde\",\"sp_nr\":\"Nr.\",\"sp_typ\":\"Typ\",\"sp_name\":\"Name oder \u00dcberschrift\",\"sp_id\":\"@id\",\"sp_felder\":\"Felder\",\"zeile_seite\":\"Seite\",\"zeile_bloecke\":\"ld+json-Bl\u00f6cke\",\"zeile_knoten\":\"Knoten\",\"zeile_dauer\":\"Dauer\",\"zeile_limit\":\"Pr\u00fcfungen in dieser Stunde \u00fcbrig\",\"wert_fehlt\":\"fehlt\",\"stufe_hoch\":\"Hoch\",\"stufe_mittel\":\"Mittel\",\"stufe_niedrig\":\"Niedrig\",\"stufe_info\":\"Hinweis\",\"stufe_gut\":\"In Ordnung\",\"keine_befunde\":\"Nichts zu melden.\",\"urteil_gut\":\"Die Strukturdaten sind in Ordnung.\",\"urteil_warnung\":\"Sie lassen sich lesen, Teile davon werden aber \u00fcbergangen.\",\"urteil_kritisch\":\"Ein Block l\u00e4sst sich nicht lesen, oder ein Knoten hat gar keinen Typ.\",\"fehler_kein_token\":\"Die Pr\u00fcfung lie\u00df sich nicht starten, weil reCAPTCHA nicht geladen hat.\",\"fehler_captcha\":\"reCAPTCHA hat die Anfrage als automatisiert eingestuft. Ein Neuladen der Seite hilft meist.\",\"fehler_zu_viele\":\"Das Limit von {limit} Pr\u00fcfungen je Stunde f\u00fcr diese Adresse ist erreicht.\",\"fehler_adresse\":\"Diese Adresse l\u00e4sst sich nicht verwenden.\",\"fehler_abruf\":\"Die Seite lie\u00df sich nicht abrufen.\",\"fehler_zaehler\":\"Der Z\u00e4hler ist nicht erreichbar, deshalb wurde nichts gepr\u00fcft.\",\"fehler_pruefdienst\":\"Der reCAPTCHA-Dienst war nicht erreichbar.\",\"fehler_aufbau\":\"Der Dienst ist nicht richtig eingerichtet. Der Fehler liegt auf dieser Seite.\",\"fehler_eingabe\":\"Die Anfrage lie\u00df sich nicht lesen.\",\"fehler_methode\":\"Falsche Anfragemethode.\",\"fehler_netz\":\"Der Dienst war nicht erreichbar.\",\"fehler_antwort\":\"Die Antwort lie\u00df sich nicht lesen.\",\"fehler_unbekannt\":\"Es ist etwas schiefgegangen, wof\u00fcr es keine eigene Meldung gibt.\",\"grund_leer\":\"Es wurde nichts eingegeben.\",\"grund_zu_lang\":\"Die Eingabe ist zu lang.\",\"grund_unlesbar\":\"Das ergibt keine Adresse.\",\"grund_schema\":\"Gepr\u00fcft werden nur http- und https-Adressen.\",\"grund_benutzerinfo\":\"Eingaben mit Zugangsdaten darin werden abgewiesen.\",\"grund_kein_punkt\":\"Der Hostname braucht mindestens einen Punkt.\",\"grund_hostform\":\"Erwartet wird ein Hostname, keine IP-Adresse.\",\"grund_port\":\"Gepr\u00fcft werden nur die Ports 80, 443, 8080 und 8443.\",\"grund_gesperrter_bereich\":\"Dieser Host l\u00f6st in ein privates oder reserviertes Netz auf. Solche werden nie abgerufen.\",\"grund_kein_dns\":\"Der Hostname l\u00f6st nicht auf.\",\"grund_abruf\":\"Die Adresse hat nicht geantwortet.\",\"grund_zu_viele_spruenge\":\"Die Adresse leitet zu oft weiter.\",\"befund_status\":\"Die Seite antwortete mit Status {status} || Die Bl\u00f6cke wurden trotzdem aus dem gelieferten Rumpf gelesen.\",\"befund_seite_gekappt\":\"Die Seite ist gr\u00f6\u00dfer als 1,5 MB || Sie wurde bis dahin gelesen; Bl\u00f6cke dahinter sind nicht gesehen worden.\",\"befund_ungueltiges_json\":\"Block {nr} ist kein g\u00fcltiges JSON || {meldung}, {zeichen} Zeichen. Der gesamte Block f\u00e4llt weg \u2014 nicht der fehlerhafte Teil, sondern alles. Ein Komma zu viel oder ein roher Zeilenumbruch in einer Zeichenkette gen\u00fcgt.\",\"befund_kein_jsonld\":\"Kein ld+json-Block im ausgelieferten HTML || Entweder tr\u00e4gt die Seite keine Strukturdaten, oder ein Skript erg\u00e4nzt sie sp\u00e4ter. Suchmaschinen rendern zwar, aber was im ausgelieferten HTML steht, sehen sie zuerst und glauben sie am ehesten.\",\"befund_keine_knoten\":\"Die Bl\u00f6cke enthalten keine brauchbaren Knoten || Das JSON l\u00e4sst sich lesen, tr\u00e4gt aber nichts mit einem Typ \u2014 ein leeres Objekt oder ein Feld aus nichts.\",\"befund_bloecke\":\"{n} Block\\\/Bl\u00f6cke mit {knoten} Knoten || Ein einzelner Block tr\u00e4gt \u00fcber @graph meist mehrere Knoten.\",\"befund_ohne_context\":\"Knoten {nr} ({typ}) tr\u00e4gt kein @context || Ohne diese Angabe ist der Wortschatz nicht festgelegt, und der Knoten wird als beliebiges JSON gelesen statt als schema.org.\",\"befund_fremder_context\":\"Knoten {nr} verwendet einen Kontext, der nicht schema.org ist || {context}. G\u00fcltiges JSON-LD, aber Suchmaschinen werten allein den schema.org-Wortschatz aus.\",\"befund_ohne_type\":\"Knoten {nr} hat kein @type || Ohne Typ gibt es nichts zu deuten; der Knoten wird vollst\u00e4ndig \u00fcbergangen.\",\"befund_pflichtfeld_fehlt\":\"Knoten {nr} vom Typ {typ} fehlt {felder} || Das sind die Felder, die Suchmaschinen f\u00fcr diesen Typ erwarten. Ohne sie wird der Knoten zwar gelesen, ergibt aber kein angereichertes Ergebnis.\",\"befund_typ_vollstaendig\":\"Knoten {nr} vom Typ {typ} tr\u00e4gt die erwarteten Felder || F\u00fcr diesen Typ fehlt nichts.\",\"befund_typ_ohne_pflichtliste\":\"Knoten {nr} ist vom Typ {typ} || F\u00fcr diesen Typ wird hier keine Pflichtfeldliste gef\u00fchrt, es greifen also nur die allgemeinen Pr\u00fcfungen.\",\"befund_adresse_relativ\":\"Knoten {nr}: {feld} ist eine relative Adresse || {wert}. Strukturdaten werden au\u00dferhalb des Seitenzusammenhangs gelesen; eine relative Adresse hat dort keine Grundlage und f\u00e4llt weg.\",\"befund_feld_leer\":\"Knoten {nr}: {feld} ist leer || Ein leeres Feld sagt weniger als ein fehlendes: Es sieht aus wie eine Angabe und ist keine.\",\"befund_datum_unlesbar\":\"Knoten {nr}: {feld} ist kein lesbares Datum || {wert}. Daten geh\u00f6ren in die ISO-8601-Form; alles andere ist Raterei, und die meisten Zerleger raten nicht.\",\"befund_datum_ohne_iso\":\"Knoten {nr}: {feld} ist lesbar, aber nicht ISO 8601 || {wert}. Es funktioniert heute, weil der Zerleger nachsichtig ist. Die ISO-Form nimmt die Frage weg, welche Zahl der Monat ist.\",\"befund_geaendert_vor_veroeffentlicht\":\"Knoten {nr}: dateModified liegt vor datePublished || Eines von beiden ist falsch. Suchmaschinen nehmen meist das sp\u00e4tere und zeigen es unter Umst\u00e4nden als Artikeldatum.\",\"befund_autor_als_text\":\"Knoten {nr}: author ist eine blosse Zeichenkette || {wert}. Erwartet wird ein Person- oder Organization-Objekt mit name; eine nackte Zeichenkette nehmen manche an und andere \u00fcbergehen sie.\",\"befund_html_im_text\":\"Knoten {nr}: {feld} enth\u00e4lt HTML || Strukturdaten sind reiner Text. Auszeichnungen erscheinen entweder w\u00f6rtlich oder f\u00fchren dazu, dass das Feld wegf\u00e4llt.\",\"befund_headline_lang\":\"Knoten {nr}: headline hat {n} Zeichen || Lange \u00dcberschriften werden in Ergebnissen abgeschnitten. Um 110 Zeichen herum beginnt das.\",\"befund_breadcrumb_ohne_position\":\"Die Breadcrumb-Liste hat {n} Eintr\u00e4ge ohne Positionsnummern || Reihenfolge ist der Zweck einer Breadcrumb. Ohne position ist die Abfolge das, was der Zerleger gerade liest.\",\"befund_breadcrumb_luecke\":\"Die Breadcrumb-Positionen haben eine L\u00fccke || Gefunden: {gefunden}. Positionen m\u00fcssen 1, 2, 3 ohne L\u00f6cher laufen; eine L\u00fccke macht die ganze Liste unbrauchbar.\",\"befund_breadcrumb_ordentlich\":\"Die Breadcrumb-Liste ist mit {n} Eintr\u00e4gen vollst\u00e4ndig || Die Positionen laufen l\u00fcckenlos, und jeder Eintrag hat einen Namen.\",\"befund_breadcrumb_ohne_name\":\"{n} Breadcrumb-Eintr\u00e4ge haben keinen Namen || Der Eintrag ist da, hat aber nichts anzuzeigen.\",\"befund_breadcrumb_ohne_item\":\"{n} Breadcrumb-Eintr\u00e4ge haben kein item || Nur der letzte darf darauf verzichten \u2014 das ist die aktuelle Seite.\",\"befund_faq_ohne_antwort\":\"{n} von {gesamt} Fragen haben keinen Antworttext || Eine Frage ohne acceptedAnswer f\u00e4llt weg, und ein FAQ-Block mit weggefallenen Fragen f\u00e4llt unter Umst\u00e4nden ganz weg.\",\"befund_faq_vollstaendig\":\"Alle {n} Fragen tragen eine Antwort || Der FAQ-Block ist vollst\u00e4ndig.\",\"befund_typ_mehrfach\":\"Der Typ {typ} kommt {n}-mal vor || F\u00fcr diesen Typ wird ein Knoten je Seite erwartet. Zwei davon zwingen Suchmaschinen zur Wahl, und die Wahl treffen sie.\",\"befund_typen\":\"Gefundene Typen: {liste} || Das ist es, was die Seite \u00fcber sich erkl\u00e4rt.\",\"befund_viele_knoten\":\"Mehr als {n} Knoten || Gelesen wurden die ersten {n}; eine Seite, die so viel erkl\u00e4rt, wiederholt sich meist.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-sdcheck.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function zeichen(w) { return (typeof w === 'string' && w !== '') ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }\n    \/** Adresse auf das kuerzen, was in einer Tabellenzelle lesbar bleibt. *\/\n    function kurz(url) {\n        var s = String(url || '');\n        s = s.replace(\/^https?:\\\/\\\/\/, '');\n        if (s.length <= 52) { return s; }\n        return s.slice(0, 24) + '\u2026' + s.slice(-26);\n    }\n\n    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten &#038;&#038; typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var knoten = liste(a.knoten).map(function (z) {\n            return { nr: zahl(z.nr), typ: zeichen(z.typ), name: zeichen(z.name), id: zeichen(z.id), felder: zahl(z.felder) };\n        });\n        return {\n            fehler: null, url: String(a.url || ''), endurl: String(a.endurl || ''),\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            bloecke: zahl(a.bloecke), knoten: knoten,\n            befunde: befunde, gruppen: gruppen, dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }\n\n    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'sdcheck' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }\n\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.SD = { bewerten: bewerten, darstellen: null, text: text, kurz: kurz, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, T: T };\n\n    var btn = document.getElementById('sd-btn');\n    var out = document.getElementById('sd-ausgabe');\n    if (!btn || !out) { return; }\n\n    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined &#038;&#038; txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }\n\n    function tabelle(b) {\n        var huelle = el('div', 'overflow-x: auto; margin: 0 0 6px;');\n        var t = el('table', 'border-collapse: collapse; width: 100%; min-width: 560px; font-size: 0.84rem;');\n        var kopf = el('tr', '');\n        [T.sp_nr, T.sp_typ, T.sp_name, T.sp_id, T.sp_felder].forEach(function (n) {\n            kopf.appendChild(el('th', 'text-align: left; padding: 6px 12px 6px 0; color: #8a8a99; font-weight: 700; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.4px; border-bottom: 1px solid var(--border, #2a2a35); white-space: nowrap;', n));\n        });\n        t.appendChild(kopf);\n        b.knoten.forEach(function (z) {\n            var r = el('tr', '');\n            function zelle(txt, stil) { r.appendChild(el('td', 'padding: 7px 12px 7px 0; border-bottom: 1px solid var(--border, #2a2a35); font-family: monospace; color: var(--text-primary, #e8e8ee);' + (stil || ''), txt)); }\n            zelle(String(z.nr !== null ? z.nr : '-'), GRAU);\n            zelle(z.typ || T.wert_fehlt, z.typ ? GUT : ROT);\n            zelle(z.name ? (z.name.length > 46 ? z.name.slice(0, 45) + '\u2026' : z.name) : '-');\n            zelle(z.id ? kurz(z.id) : '-', GRAU);\n            zelle(String(z.felder !== null ? z.felder : '-'), GRAU);\n            t.appendChild(r);\n        });\n        huelle.appendChild(t);\n        return huelle;\n    }<\/p>\n<p>    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund && T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 12px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));<\/p>\n<p>        var g = gitter('auto auto');\n        paar(g, T.zeile_seite, b.endurl || b.url, GRAU);\n        paar(g, T.zeile_bloecke, String(b.bloecke !== null ? b.bloecke : '-'), b.bloecke ? GRAU : WARN);\n        paar(g, T.zeile_knoten, String(b.knoten.length), GRAU);\n        if (b.dauer !== null) { paar(g, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);<\/p>\n<p>        if (b.knoten.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_knoten));\n            ziel.appendChild(tabelle(b));\n            ziel.appendChild(el('p', ZELLE + ' margin: 0 0 6px; font-size: 0.8rem;', T.tabelle_hinweis));\n        }<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var daten = {};\n                Object.keys(f.daten).forEach(function (n) { daten[n] = (n === 'url') ? kurz(f.daten[n]) : f.daten[n]; });\n                var t = text('befund_' + f.key, daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.SD.darstellen = darstellen;<\/p>\n<p>    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('sd-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Holt eine Seite, zieht jeden ld+json-Block heraus und liest die Knoten einzeln: L\u00e4sst sich das JSON \u00fcberhaupt lesen, tr\u00e4gt jeder Knoten @context und @type, sind die Felder da, die Suchmaschinen erwarten, stehen Adressen absolut und Daten maschinenlesbar, und h\u00e4ngt eine Breadcrumb-Liste l\u00fcckenlos zusammen. Ein Abruf, und nur das, was der Server sendet.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92737,92289,92759],"class_list":["post-15738","page","type-page","status-publish","hentry","tag-content-de","tag-seo-de","tag-web-development-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Strukturdaten-Pr\u00fcfer f\u00fcr JSON-LD: was eine Seite tats\u00e4chlich \u00fcber sich erkl\u00e4rt - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Strukturdaten-Pr\u00fcfer f\u00fcr JSON-LD: was eine Seite tats\u00e4chlich \u00fcber sich erkl\u00e4rt - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Holt eine Seite, zieht jeden ld+json-Block heraus und liest die Knoten einzeln: L\u00e4sst sich das JSON \u00fcberhaupt lesen, tr\u00e4gt jeder Knoten @context und @type, sind die Felder da, die Suchmaschinen erwarten, stehen Adressen absolut und Daten maschinenlesbar, und h\u00e4ngt eine Breadcrumb-Liste l\u00fcckenlos zusammen. Ein Abruf, und nur das, was der Server sendet.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/live-json-ld-structured-data-validator\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/live-json-ld-structured-data-validator\\\/\",\"name\":\"Strukturdaten-Pr\u00fcfer f\u00fcr JSON-LD: was eine Seite tats\u00e4chlich \u00fcber sich erkl\u00e4rt - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-06T09:22:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/live-json-ld-structured-data-validator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/live-json-ld-structured-data-validator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/live-json-ld-structured-data-validator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Strukturdaten-Pr\u00fcfer f\u00fcr JSON-LD: was eine Seite tats\u00e4chlich \u00fcber sich erkl\u00e4rt\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Strukturdaten-Pr\u00fcfer f\u00fcr JSON-LD: was eine Seite tats\u00e4chlich \u00fcber sich erkl\u00e4rt - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/","og_locale":"en_US","og_type":"article","og_title":"Strukturdaten-Pr\u00fcfer f\u00fcr JSON-LD: was eine Seite tats\u00e4chlich \u00fcber sich erkl\u00e4rt - Lukas Wojcik - Blog","og_description":"Holt eine Seite, zieht jeden ld+json-Block heraus und liest die Knoten einzeln: L\u00e4sst sich das JSON \u00fcberhaupt lesen, tr\u00e4gt jeder Knoten @context und @type, sind die Felder da, die Suchmaschinen erwarten, stehen Adressen absolut und Daten maschinenlesbar, und h\u00e4ngt eine Breadcrumb-Liste l\u00fcckenlos zusammen. Ein Abruf, und nur das, was der Server sendet.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/","name":"Strukturdaten-Pr\u00fcfer f\u00fcr JSON-LD: was eine Seite tats\u00e4chlich \u00fcber sich erkl\u00e4rt - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-06T09:22:47+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/live-json-ld-structured-data-validator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-2\/"},{"@type":"ListItem","position":3,"name":"Strukturdaten-Pr\u00fcfer f\u00fcr JSON-LD: was eine Seite tats\u00e4chlich \u00fcber sich erkl\u00e4rt"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15738","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=15738"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15738\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15738"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}