{"id":10257,"date":"2026-08-15T00:46:10","date_gmt":"2026-08-14T22:46:10","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/json-ld-structured-data-generator\/"},"modified":"2026-08-15T00:46:10","modified_gmt":"2026-08-14T22:46:10","slug":"json-ld-structured-data-generator","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/json-ld-structured-data-generator\/","title":{"rendered":"JSON-LD f\u00fcr strukturierte Daten erzeugen und pr\u00fcfen"},"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;\">Strukturierte Daten scheitern leise: ein relativer Bildpfad, ein Datum im falschen Format oder ein Preis mit W\u00e4hrungszeichen gen\u00fcgen, damit das Rich Result ausbleibt. Dieses Werkzeug baut die Auszeichnung und benennt genau diese F\u00e4lle.<\/p>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap;\">\n<div style=\"flex: 1; min-width: 190px;\">\n            <label for=\"ld-typ\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Typ<\/label><br \/>\n            <select id=\"ld-typ\" 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; font-family: monospace; box-sizing: border-box;\"><option value=\"Article\">Article<\/option><option value=\"FAQPage\">FAQPage<\/option><option value=\"HowTo\">HowTo<\/option><option value=\"Product\">Product<\/option><option value=\"Organization\">Organization<\/option><option value=\"BreadcrumbList\">BreadcrumbList<\/option><\/select>\n        <\/div>\n<div style=\"flex: 2; min-width: 240px;\">\n            <label for=\"ld-name\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Name oder \u00dcberschrift<\/label><br \/>\n            <input type=\"text\" id=\"ld-name\" 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; font-family: monospace; box-sizing: border-box;\" value=\"Server-Side Tagging in der Praxis\">\n        <\/div>\n<div style=\"flex: 2; min-width: 240px;\">\n            <label for=\"ld-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Adresse<\/label><br \/>\n            <input type=\"text\" id=\"ld-url\" 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; font-family: monospace; box-sizing: border-box;\" value=\"https:\/\/www.example.com\/blog\/server-side-tagging\/\">\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 12px;\">\n<div style=\"flex: 2; min-width: 240px;\">\n            <label for=\"ld-bild\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Bild oder Logo (vollst\u00e4ndige Adresse)<\/label><br \/>\n            <input type=\"text\" id=\"ld-bild\" 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; font-family: monospace; box-sizing: border-box;\" value=\"https:\/\/www.example.com\/bilder\/beitrag.jpg\">\n        <\/div>\n<div style=\"flex: 2; min-width: 220px;\">\n            <label for=\"ld-autor\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Autor oder Marke<\/label><br \/>\n            <input type=\"text\" id=\"ld-autor\" 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; font-family: monospace; box-sizing: border-box;\" value=\"Lukas Wojcik\">\n        <\/div>\n<div style=\"flex: 1; min-width: 160px;\">\n            <label for=\"ld-datum\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Ver\u00f6ffentlicht am<\/label><br \/>\n            <input type=\"text\" id=\"ld-datum\" 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; font-family: monospace; box-sizing: border-box;\" value=\"2026-08-15\">\n        <\/div>\n<div style=\"flex: 1; min-width: 130px;\">\n            <label for=\"ld-preis\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Preis (bei Product)<\/label><br \/>\n            <input type=\"text\" id=\"ld-preis\" 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; font-family: monospace; box-sizing: border-box;\" placeholder=\"49.90\">\n        <\/div>\n<\/p><\/div>\n<p>    <label for=\"ld-beschreibung\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin: 12px 0 5px;\">Beschreibung<\/label><br \/>\n    <input type=\"text\" id=\"ld-beschreibung\" 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; font-family: monospace; box-sizing: border-box;\" value=\"Wie ein serverseitiger Container aufgebaut wird und was er kostet.\"><\/p>\n<p>    <label for=\"ld-zeilen\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin: 12px 0 5px;\">Ein Eintrag je Zeile, Frage und Antwort durch einen senkrechten Strich getrennt<\/label><br \/>\n    <textarea id=\"ld-zeilen\" class=\"form-control\" style=\"width: 100%; height: 100px; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; font-size: 0.85rem; box-sizing: border-box;\" placeholder=\"Wie lange dauert serverseitiges Tagging? | Zwei Tage f\u00fcr einen einfachen Container.\"><\/textarea><\/p>\n<p>    <label for=\"ld-pruefen\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin: 12px 0 5px;\">Stattdessen vorhandenes JSON-LD pr\u00fcfen (optional)<\/label><br \/>\n    <textarea id=\"ld-pruefen\" class=\"form-control\" style=\"width: 100%; height: 90px; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; font-size: 0.85rem; box-sizing: border-box;\" placeholder=\"Auszeichnung hier einf\u00fcgen, dann bleiben die Felder dar\u00fcber unbeachtet\"><\/textarea><\/p>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap; margin: 18px 0 0;\">\n        <button id=\"ld-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Bauen und pr\u00fcfen<\/button>\n    <\/div>\n<div id=\"ld-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Strukturierte Daten scheitern leise: ein relativer Bildpfad, ein Datum im falschen Format oder ein Preis mit W\u00e4hrungszeichen gen\u00fcgen, damit das Rich Result ausbleibt. Dieses Werkzeug baut die Auszeichnung und benennt genau diese F\u00e4lle.\",\"label_typ\":\"Typ\",\"label_name\":\"Name oder \u00dcberschrift\",\"label_url\":\"Adresse\",\"label_bild\":\"Bild oder Logo (vollst\u00e4ndige Adresse)\",\"label_autor\":\"Autor oder Marke\",\"label_datum\":\"Ver\u00f6ffentlicht am\",\"label_preis\":\"Preis (bei Product)\",\"label_beschreibung\":\"Beschreibung\",\"label_zeilen\":\"Ein Eintrag je Zeile, Frage und Antwort durch einen senkrechten Strich getrennt\",\"ph_zeilen\":\"Wie lange dauert serverseitiges Tagging? | Zwei Tage f\u00fcr einen einfachen Container.\",\"label_pruefen\":\"Stattdessen vorhandenes JSON-LD pr\u00fcfen (optional)\",\"ph_pruefen\":\"Auszeichnung hier einf\u00fcgen, dann bleiben die Felder dar\u00fcber unbeachtet\",\"knopf\":\"Bauen und pr\u00fcfen\",\"fehler_json\":\"Die eingef\u00fcgte Auszeichnung ist kein g\u00fcltiges JSON: %s\",\"h_erzeugt\":\"Erzeugte Auszeichnung\",\"h_geprueft\":\"Auszeichnung, wie sie gelesen wurde\",\"h_befunde\":\"Befunde\",\"keine_befunde\":\"An dieser Auszeichnung ist nichts zu beanstanden.\",\"hinweis_einbau\":\"Der Block geh\u00f6rt in den Kopf der Seite oder an eine beliebige Stelle im K\u00f6rper. Er muss beschreiben, was ein Besucher auf der Seite auch wirklich sieht.\",\"b_kein_objekt\":\"Die Auszeichnung ist kein Objekt.\",\"b_ohne_kontext\":\"@context fehlt, ohne diese Angabe wird nichts als schema.org gelesen.\",\"b_kontext_falsch\":\"@context lautet %s statt https:\\\/\\\/schema.org.\",\"b_ohne_typ\":\"@type fehlt, damit l\u00e4sst sich nichts zuordnen.\",\"b_typ_schreibweise\":\"@type lautet %s; die Schreibweise muss genau %r sein, Gro\u00dfschreibung eingeschlossen.\",\"b_typ_unbekannt\":\"@type %s geh\u00f6rt nicht zu den hier gepr\u00fcften Typen, es greifen nur die allgemeinen Regeln.\",\"b_bild_relativ\":\"Das Bild in %s ist keine vollst\u00e4ndige Adresse. Ein relativer Pfad wird nicht aufgel\u00f6st.\",\"b_datum\":\"%s tr\u00e4gt %w, das ist kein Datum nach ISO 8601.\",\"b_datum_reihenfolge\":\"dateModified liegt vor datePublished.\",\"b_ohne_headline\":\"headline fehlt, das einzige Pflichtfeld eines Artikels.\",\"b_headline_lang\":\"headline ist %s Zeichen lang; jenseits von rund 110 wird abgeschnitten.\",\"b_ohne_bild\":\"Es fehlt ein Bild. Ohne eines ist ein Rich Result unwahrscheinlich.\",\"b_ohne_datum\":\"datePublished fehlt.\",\"b_ohne_autor\":\"author fehlt.\",\"b_autor_text\":\"author ist eine blo\u00dfe Zeichenkette. Ein Objekt mit @type Person oder Organization ist die sichere Form.\",\"b_autor_ohne_typ\":\"Das Autorenobjekt hat kein @type.\",\"b_ohne_name\":\"name fehlt.\",\"b_faq_leer\":\"mainEntity ist leer, die FAQ-Seite hat damit keine Fragen.\",\"b_faq_typ\":\"Eintrag %s in mainEntity ist keine Question.\",\"b_faq_ohne_frage\":\"Frage %s hat kein name.\",\"b_faq_ohne_antwort\":\"Frage %s hat keine acceptedAnswer mit text.\",\"b_faq_sichtbar\":\"Jede Frage und jede Antwort muss auf der Seite selbst sichtbar sein, sonst gilt die Auszeichnung als irref\u00fchrend.\",\"b_howto_leer\":\"step ist leer, eine Anleitung ohne Schritte ist keine.\",\"b_howto_ohne_name\":\"Schritt %s hat kein name.\",\"b_ohne_angebot\":\"offers fehlt, das Produkt tr\u00e4gt damit keinen Preis.\",\"b_ohne_preis\":\"price fehlt in offers.\",\"b_preis_form\":\"price lautet %s. Es muss eine reine Zahl sein, ohne W\u00e4hrungszeichen und mit Punkt als Dezimaltrennung.\",\"b_ohne_waehrung\":\"priceCurrency fehlt.\",\"b_verfuegbarkeit\":\"availability lautet %s; erwartet wird eine schema.org-Adresse wie https:\\\/\\\/schema.org\\\/InStock.\",\"b_bewertung_wert\":\"aggregateRating hat kein ratingValue.\",\"b_bewertung_anzahl\":\"aggregateRating hat weder reviewCount noch ratingCount.\",\"b_ohne_url\":\"url fehlt.\",\"b_url_relativ\":\"url ist nicht vollst\u00e4ndig.\",\"b_ohne_logo\":\"logo fehlt.\",\"b_breadcrumb_leer\":\"itemListElement ist leer.\",\"b_breadcrumb_position\":\"Eintrag %s hat kein position.\",\"b_breadcrumb_name\":\"Eintrag %s hat kein name.\",\"b_html\":\"Die Auszeichnung tr\u00e4gt HTML-Elemente. Strukturierte Daten erwarten reinen Text.\",\"b_beispiel\":\"example.com steht noch darin, das deutet auf eine nie ausgef\u00fcllte Vorlage hin.\"};<\/p>\n<p>    \/\/ --- reine Rechenlogik ---<\/p>\n<p>    const TYPEN = ['Article', 'FAQPage', 'HowTo', 'Product', 'Organization', 'BreadcrumbList'];<\/p>\n<p>    function text(wert) {\n        return String(wert === undefined || wert === null ? '' : wert).trim();\n    }<\/p>\n<p>    function zeilenPaare(roh) {\n        return String(roh === undefined || roh === null ? '' : roh)\n            .split(\/\\r?\\n\/)\n            .map(function (z) { return z.trim(); })\n            .filter(function (z) { return z !== ''; })\n            .map(function (z) {\n                const trenner = z.indexOf('|');\n                if (trenner === -1) { return { links: z, rechts: '' }; }\n                return { links: z.slice(0, trenner).trim(), rechts: z.slice(trenner + 1).trim() };\n            });\n    }<\/p>\n<p>    function istAbsolut(adresse) {\n        return \/^https?:\\\/\\\/[^\\s]+$\/i.test(String(adresse));\n    }<\/p>\n<p>    function istIsoDatum(wert) {\n        \/\/ Erlaubt ist ein Datum oder ein Zeitpunkt nach ISO 8601.\n        return \/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?)?$\/.test(String(wert));\n    }<\/p>\n<p>    function erzeugen(e) {\n        const eingabe = e || {};\n        const typ = TYPEN.indexOf(eingabe.typ) !== -1 ? eingabe.typ : 'Article';\n        const name = text(eingabe.name);\n        const url = text(eingabe.url);\n        const bild = text(eingabe.bild);\n        const autor = text(eingabe.autor);\n        const datum = text(eingabe.datum);\n        const preis = text(eingabe.preis).replace(',', '.');\n        const beschreibung = text(eingabe.beschreibung);\n        const paare = zeilenPaare(eingabe.zeilen);<\/p>\n<p>        const daten = { '@context': 'https:\/\/schema.org', '@type': typ };<\/p>\n<p>        if (typ === 'Article') {\n            daten.headline = name;\n            if (beschreibung) { daten.description = beschreibung; }\n            if (bild) { daten.image = [bild]; }\n            if (autor) { daten.author = { '@type': 'Person', name: autor }; }\n            if (datum) { daten.datePublished = datum; daten.dateModified = datum; }\n            if (url) { daten.mainEntityOfPage = { '@type': 'WebPage', '@id': url }; }\n        } else if (typ === 'FAQPage') {\n            daten.mainEntity = paare.map(function (p) {\n                return {\n                    '@type': 'Question',\n                    name: p.links,\n                    acceptedAnswer: { '@type': 'Answer', text: p.rechts }\n                };\n            });\n        } else if (typ === 'HowTo') {\n            daten.name = name;\n            if (beschreibung) { daten.description = beschreibung; }\n            if (bild) { daten.image = bild; }\n            daten.step = paare.map(function (p, i) {\n                const schritt = { '@type': 'HowToStep', position: i + 1, name: p.links };\n                if (p.rechts) { schritt.text = p.rechts; }\n                return schritt;\n            });\n        } else if (typ === 'Product') {\n            daten.name = name;\n            if (beschreibung) { daten.description = beschreibung; }\n            if (bild) { daten.image = [bild]; }\n            if (autor) { daten.brand = { '@type': 'Brand', name: autor }; }\n            daten.offers = {\n                '@type': 'Offer',\n                price: preis,\n                priceCurrency: 'EUR',\n                availability: 'https:\/\/schema.org\/InStock'\n            };\n            if (url) { daten.offers.url = url; }\n        } else if (typ === 'Organization') {\n            daten.name = name;\n            if (url) { daten.url = url; }\n            if (bild) { daten.logo = bild; }\n            if (beschreibung) { daten.description = beschreibung; }\n            if (paare.length) {\n                daten.sameAs = paare.map(function (p) { return p.links; });\n            }\n        } else if (typ === 'BreadcrumbList') {\n            daten.itemListElement = paare.map(function (p, i) {\n                return { '@type': 'ListItem', position: i + 1, name: p.links, item: p.rechts };\n            });\n        }<\/p>\n<p>        return daten;\n    }<\/p>\n<p>    function pruefen(daten) {\n        const befunde = [];\n        function schwer(t) { befunde.push({ schwer: true, text: t }); }\n        function leicht(t) { befunde.push({ schwer: false, text: t }); }<\/p>\n<p>        if (!daten || typeof daten !== 'object') {\n            schwer(T.b_kein_objekt);\n            return befunde;\n        }\n        const kontext = daten['@context'];\n        if (!kontext) {\n            schwer(T.b_ohne_kontext);\n        } else if (String(kontext).replace(\/^http:\/, 'https:').replace(\/\\\/$\/, '') !== 'https:\/\/schema.org') {\n            schwer(T.b_kontext_falsch.replace('%s', String(kontext)));\n        }<\/p>\n<p>        const typ = daten['@type'];\n        if (!typ) {\n            schwer(T.b_ohne_typ);\n            return befunde;\n        }\n        if (TYPEN.indexOf(String(typ)) === -1) {\n            const passend = TYPEN.filter(function (t) { return t.toLowerCase() === String(typ).toLowerCase(); });\n            if (passend.length) {\n                schwer(T.b_typ_schreibweise.replace('%s', String(typ)).replace('%r', passend[0]));\n            } else {\n                leicht(T.b_typ_unbekannt.replace('%s', String(typ)));\n            }\n        }<\/p>\n<p>        function pruefeBild(wert, feld) {\n            const liste = Array.isArray(wert) ? wert : [wert];\n            liste.forEach(function (b) {\n                const adresse = b && b['@type'] ? b.url : b;\n                if (!adresse) { return; }\n                if (!istAbsolut(adresse)) {\n                    schwer(T.b_bild_relativ.replace('%s', feld));\n                }\n            });\n        }<\/p>\n<p>        function pruefeDatum(wert, feld) {\n            if (wert === undefined) { return; }\n            if (!istIsoDatum(wert)) {\n                schwer(T.b_datum.replace('%s', feld).replace('%w', String(wert)));\n            }\n        }<\/p>\n<p>        if (String(typ) === 'Article' || String(typ) === 'BlogPosting' || String(typ) === 'NewsArticle') {\n            if (!daten.headline) { schwer(T.b_ohne_headline); }\n            else if (String(daten.headline).length > 110) { leicht(T.b_headline_lang.replace('%s', String(String(daten.headline).length))); }\n            if (!daten.image) { leicht(T.b_ohne_bild); } else { pruefeBild(daten.image, 'image'); }\n            if (!daten.datePublished) { leicht(T.b_ohne_datum); }\n            pruefeDatum(daten.datePublished, 'datePublished');\n            pruefeDatum(daten.dateModified, 'dateModified');\n            if (!daten.author) { schwer(T.b_ohne_autor); }\n            else if (typeof daten.author === 'string') { leicht(T.b_autor_text); }\n            else if (!daten.author['@type']) { leicht(T.b_autor_ohne_typ); }\n            if (daten.datePublished && daten.dateModified && String(daten.dateModified) < String(daten.datePublished)) {\n                schwer(T.b_datum_reihenfolge);\n            }\n        }\n\n        if (String(typ) === 'FAQPage') {\n            const fragen = daten.mainEntity;\n            if (!Array.isArray(fragen) || !fragen.length) {\n                schwer(T.b_faq_leer);\n            } else {\n                fragen.forEach(function (f, i) {\n                    if (!f || f['@type'] !== 'Question') { schwer(T.b_faq_typ.replace('%s', String(i + 1))); return; }\n                    if (!f.name) { schwer(T.b_faq_ohne_frage.replace('%s', String(i + 1))); }\n                    const antwort = f.acceptedAnswer;\n                    if (!antwort || !antwort.text) { schwer(T.b_faq_ohne_antwort.replace('%s', String(i + 1))); }\n                });\n                leicht(T.b_faq_sichtbar);\n            }\n        }\n\n        if (String(typ) === 'HowTo') {\n            if (!daten.name) { schwer(T.b_ohne_name); }\n            if (!Array.isArray(daten.step) || !daten.step.length) {\n                schwer(T.b_howto_leer);\n            } else {\n                daten.step.forEach(function (s, i) {\n                    if (!s || !s.name) { schwer(T.b_howto_ohne_name.replace('%s', String(i + 1))); }\n                });\n            }\n        }\n\n        if (String(typ) === 'Product') {\n            if (!daten.name) { schwer(T.b_ohne_name); }\n            if (!daten.image) { leicht(T.b_ohne_bild); } else { pruefeBild(daten.image, 'image'); }\n            const angebot = daten.offers;\n            if (!angebot) {\n                leicht(T.b_ohne_angebot);\n            } else {\n                const eins = Array.isArray(angebot) ? angebot[0] : angebot;\n                if (eins.price === undefined || String(eins.price) === '') {\n                    schwer(T.b_ohne_preis);\n                } else if (!\/^[0-9]+(\\.[0-9]+)?$\/.test(String(eins.price))) {\n                    schwer(T.b_preis_form.replace('%s', String(eins.price)));\n                }\n                if (!eins.priceCurrency) { schwer(T.b_ohne_waehrung); }\n                if (eins.availability &#038;&#038; String(eins.availability).indexOf('schema.org') === -1) {\n                    schwer(T.b_verfuegbarkeit.replace('%s', String(eins.availability)));\n                }\n            }\n            if (daten.aggregateRating) {\n                const bewertung = daten.aggregateRating;\n                if (bewertung.ratingValue === undefined) { schwer(T.b_bewertung_wert); }\n                if (bewertung.reviewCount === undefined &#038;&#038; bewertung.ratingCount === undefined) { schwer(T.b_bewertung_anzahl); }\n            }\n        }\n\n        if (String(typ) === 'Organization') {\n            if (!daten.name) { schwer(T.b_ohne_name); }\n            if (!daten.url) { leicht(T.b_ohne_url); } else if (!istAbsolut(daten.url)) { schwer(T.b_url_relativ); }\n            if (!daten.logo) { leicht(T.b_ohne_logo); } else { pruefeBild(daten.logo, 'logo'); }\n        }\n\n        if (String(typ) === 'BreadcrumbList') {\n            const liste = daten.itemListElement;\n            if (!Array.isArray(liste) || !liste.length) {\n                schwer(T.b_breadcrumb_leer);\n            } else {\n                liste.forEach(function (eintrag, i) {\n                    if (!eintrag || eintrag.position === undefined) { schwer(T.b_breadcrumb_position.replace('%s', String(i + 1))); }\n                    if (!eintrag || !eintrag.name) { schwer(T.b_breadcrumb_name.replace('%s', String(i + 1))); }\n                });\n            }\n        }\n\n        \/\/ Allgemeines, das jeden Typ trifft\n        const alsText = JSON.stringify(daten);\n        if (\/<[a-z][^>]*>\/i.test(alsText)) {\n            leicht(T.b_html);\n        }\n        if (alsText.indexOf('example.com') !== -1) {\n            leicht(T.b_beispiel);\n        }<\/p>\n<p>        return befunde;\n    }<\/p>\n<p>    function verarbeiten(eingabe) {\n        const ergebnis = { ok: false, fehler: '', daten: null, json: '', befunde: [], gepruefteEingabe: false };\n        const roh = text((eingabe || {}).pruefen);<\/p>\n<p>        if (roh !== '') {\n            let geparst;\n            const ohneTag = roh.replace(\/<script[^>]*>\/i, '').replace(\/<\\\/script>\/i, '').trim();\n            try {\n                geparst = JSON.parse(ohneTag);\n            } catch (fehler) {\n                ergebnis.fehler = T.fehler_json.replace('%s', fehler && fehler.message ? fehler.message : '');\n                return ergebnis;\n            }\n            if (Array.isArray(geparst)) { geparst = geparst[0]; }\n            if (geparst && geparst['@graph'] && Array.isArray(geparst['@graph'])) { geparst = geparst['@graph'][0]; }\n            ergebnis.daten = geparst;\n            ergebnis.gepruefteEingabe = true;\n        } else {\n            ergebnis.daten = erzeugen(eingabe);\n        }<\/p>\n<p>        ergebnis.json = JSON.stringify(ergebnis.daten, null, 2);\n        ergebnis.befunde = pruefen(ergebnis.daten);\n        ergebnis.ok = true;\n        return ergebnis;\n    }<\/p>\n<p>    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.LD = {\n            verarbeiten: verarbeiten, erzeugen: erzeugen, pruefen: pruefen,\n            zeilenPaare: zeilenPaare, istIsoDatum: istIsoDatum, istAbsolut: istAbsolut\n        };\n    }<\/p>\n<p>    \/\/ --- Anbindung an das Dokument ---<\/p>\n<p>    const btn = document.getElementById('ld-btn');\n    const out = document.getElementById('ld-ergebnis');\n    if (!btn || !out) { return; }<\/p>\n<p>    const KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px; margin-bottom: 18px;';\n    const UEBERSCHRIFT = 'color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 8px;';<\/p>\n<p>    function el(tag, css, inhalt) {\n        const knoten = document.createElement(tag);\n        if (css) { knoten.setAttribute('style', css); }\n        if (inhalt !== undefined && inhalt !== null) { knoten.textContent = inhalt; }\n        return knoten;\n    }<\/p>\n<p>    function wert(id) {\n        const knoten = document.getElementById(id);\n        return knoten ? knoten.value : '';\n    }<\/p>\n<p>    btn.addEventListener('click', function () {\n        const erg = verarbeiten({\n            typ: wert('ld-typ'),\n            name: wert('ld-name'),\n            url: wert('ld-url'),\n            bild: wert('ld-bild'),\n            autor: wert('ld-autor'),\n            datum: wert('ld-datum'),\n            preis: wert('ld-preis'),\n            beschreibung: wert('ld-beschreibung'),\n            zeilen: wert('ld-zeilen'),\n            pruefen: wert('ld-pruefen')\n        });<\/p>\n<p>        out.textContent = '';\n        if (!erg.ok) {\n            out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #ffb86c; color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', erg.fehler));\n            return;\n        }<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, erg.gepruefteEingabe ? T.h_geprueft : T.h_erzeugt));\n        const code = el('pre', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); padding: 16px; border-radius: 6px; overflow-x: auto; font-family: monospace; font-size: 0.82rem; line-height: 1.5; white-space: pre; margin-bottom: 8px;');\n        code.textContent = '<script type=\"application\/ld+json\">\\n' + erg.json + '\\n<' + '\/script>';\n        out.appendChild(code);\n        out.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 18px;', T.hinweis_einbau));<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        const kasten = el('div', KASTEN);\n        if (!erg.befunde.length) {\n            kasten.appendChild(el('div', 'color: var(--accent, #7ee787);', T.keine_befunde));\n        }\n        erg.befunde.forEach(function (b) {\n            const z = el('div', 'display: flex; gap: 10px; padding: 5px 0;');\n            z.appendChild(el('span', 'color: ' + (b.schwer ? '#ffb86c' : 'var(--text-secondary, #a0a0b0)') + '; font-family: monospace;', b.schwer ? '!' : '-'));\n            z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-size: 0.9rem; line-height: 1.5;', b.text));\n            kasten.appendChild(z);\n        });\n        out.appendChild(kasten);\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Baut JSON-LD f\u00fcr Article, FAQPage, HowTo, Product, Organization und BreadcrumbList und pr\u00fcft vorhandene Auszeichnung auf die Fehler, die ein Rich Result lautlos kosten.<\/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":[92088,92026],"class_list":["post-10257","page","type-page","status-publish","hentry","tag-data-quality-de","tag-marketing-cyfrowy-pl-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>JSON-LD f\u00fcr strukturierte Daten erzeugen und pr\u00fcfen - 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\/json-ld-structured-data-generator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JSON-LD f\u00fcr strukturierte Daten erzeugen und pr\u00fcfen - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Baut JSON-LD f\u00fcr Article, FAQPage, HowTo, Product, Organization und BreadcrumbList und pr\u00fcft vorhandene Auszeichnung auf die Fehler, die ein Rich Result lautlos kosten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/json-ld-structured-data-generator\/\" \/>\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<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/json-ld-structured-data-generator\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/json-ld-structured-data-generator\\\/\",\"name\":\"JSON-LD f\u00fcr strukturierte Daten erzeugen und pr\u00fcfen - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:46:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/json-ld-structured-data-generator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/json-ld-structured-data-generator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/json-ld-structured-data-generator\\\/#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\":\"JSON-LD f\u00fcr strukturierte Daten erzeugen und pr\u00fcfen\"}]},{\"@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":"JSON-LD f\u00fcr strukturierte Daten erzeugen und pr\u00fcfen - 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\/json-ld-structured-data-generator\/","og_locale":"en_US","og_type":"article","og_title":"JSON-LD f\u00fcr strukturierte Daten erzeugen und pr\u00fcfen - Lukas Wojcik - Blog","og_description":"Baut JSON-LD f\u00fcr Article, FAQPage, HowTo, Product, Organization und BreadcrumbList und pr\u00fcft vorhandene Auszeichnung auf die Fehler, die ein Rich Result lautlos kosten.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/json-ld-structured-data-generator\/","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","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/json-ld-structured-data-generator\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/json-ld-structured-data-generator\/","name":"JSON-LD f\u00fcr strukturierte Daten erzeugen und pr\u00fcfen - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:46:10+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/json-ld-structured-data-generator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/json-ld-structured-data-generator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/json-ld-structured-data-generator\/#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":"JSON-LD f\u00fcr strukturierte Daten erzeugen und pr\u00fcfen"}]},{"@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\/10257","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=10257"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10257\/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=10257"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}