JSON-LD structured data for Google rich results
13 min read

Strukturierte Daten für besseres SEO: JSON-LD in Astro-Seiten

#SEO #JSON-LD #Schema.org

Du hast eine gut strukturierte Astro-Website gebaut. Die Inhalte sind durchdacht, die Seiten laden schnell, das Design ist barrierefrei. Doch wenn Google deine Seiten crawlt, sieht es nur Text und HTML-Elemente. Es versteht nicht automatisch, dass dein FAQ-Bereich Fragen und Antworten enthalt, dass deine Leistungsseite Services beschreibt oder dass dein Unternehmen an einem bestimmten Standort operiert. Genau hier kommen strukturierte Daten ins Spiel.

JSON-LD (JavaScript Object Notation for Linked Data) ist Googles bevorzugtes Format, um Maschinen mitzuteilen, was der Inhalt einer Seite bedeutet — nicht nur, was er darstellt. Ein unsichtbares <script>-Tag im HTML-Head liefert Suchmaschinen einen strukturierten Datensatz, der direkt zu Rich Results in den Suchergebnissen fuhrt: aufklappbare FAQ-Antworten, Sternebewertungen, Breadcrumb-Pfade und Visitenkarten mit Adresse und Offnungszeiten.

Google verwendet strukturierte Daten, um den Inhalt einer Seite zu verstehen und diesen Inhalt in einem visuell ansprechenderen Format in den Suchergebnissen darzustellen — als sogenannte Rich Results.

Google Search Central Offizielle Dokumentation

Warum strukturierte Daten entscheidend sind

4
Schema-Typen implementiert
Dieses Portfolio
30%
Mehr Klicks durch Rich Results
Google Search Central
0
Performance-Einbussen
Kein Render-Blocking

Rich Results heben deine Seite visuell aus der Masse der Suchergebnisse hervor. Wahrend normale Ergebnisse nur Titel, URL und Meta-Description zeigen, konnen Seiten mit strukturierten Daten aufklappbare FAQ-Sektionen, Sternebewertungen, Breadcrumb-Navigation, Preistabellen und Unternehmensdetails direkt in der SERP anzeigen. Das bedeutet mehr Flache, mehr Aufmerksamkeit und deutlich hohere Klickraten.

Strukturierte Daten sind dabei kein Ranking-Faktor im engeren Sinne — sie helfen Google aber, den Kontext deiner Inhalte besser zu verstehen. Und indirekt verbessern hohere Klickraten, niedrigere Absprungraten und eine bessere Nutzerinteraktion dein Ranking sehr wohl.

Was ist JSON-LD?

JSON-LD steht fur JavaScript Object Notation for Linked Data. Es ist ein standardisiertes Format, das semantische Informationen in einem <script>-Tag im HTML-Dokument einbettet. Suchmaschinen lesen dieses Tag, Nutzer sehen es nicht.

<!-- Unsichtbar fur Nutzer, maschinenlesbar fur Google -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "WebPage",
  "name": "Meine Seite",
  "description": "Eine Beschreibung der Seite"
}
</script>

Das Entscheidende: JSON-LD wird nicht gerendert. Es liegt als unsichtbares Skript im <head> oder am Ende des <body>. Es blockiert weder das Rendering noch verlangsamt es den Seitenaufbau. Es ist reines Metadaten-Markup — Google liest es, der Browser ignoriert es.

Die vier Schema-Typen im Uberblick

In diesem Portfolio verwenden wir vier Schema.org-Typen, die gemeinsam ein vollstandiges semantisches Bild der Website fur Suchmaschinen erzeugen.

FAQPage JSON-LD Schema mit Google Rich Result Vorschau
FAQPage

Macht FAQ-Inhalte direkt in den Google-Suchergebnissen als aufklappbare Fragen sichtbar. Jede Frage-Antwort-Kombination wird als eigenstandiges Element im Schema erfasst. Google rendert diese als expandierbare Dropdowns unterhalb des normalen Suchergebnisses -- das kann die sichtbare Flache deines Ergebnisses verdreifachen und Klickraten um bis zu 30% steigern.

Service JSON-LD Schema mit Rich Result Vorschau
Service

Teilt Google mit, welche Dienstleistungen du anbietest, inklusive Name, Beschreibung und Anbieter-Informationen. Besonders relevant fur Freelancer und Agenturen, deren Service-Seiten in den Suchergebnissen mit zusatzlichen Details angezeigt werden konnen. In Kombination mit LocalBusiness entsteht ein umfassendes Bild deines Angebots.

BreadcrumbList JSON-LD Schema mit SERP-Navigationspfad
BreadcrumbList

Erzeugt einen Navigationspfad in den Suchergebnissen (Home > Leistungen > Webentwicklung). Google ersetzt die nackte URL durch eine lesbare Pfadstruktur. Das verbessert die Orientierung fur Nutzer direkt in der SERP und signalisiert Google eine klare Website-Hierarchie. Wird auf jeder Seite uber die Breadcrumbs-Komponente generiert.

LocalBusiness JSON-LD Schema mit Knowledge Graph Vorschau
LocalBusiness

Enthalt Firmenname, Adresse, Geo-Koordinaten und Kontaktdaten. Essentiell fur lokales SEO -- Google nutzt diese Daten fur den Knowledge Graph, Google Maps-Einblendungen und die lokale Suche. Wird seitenweit uber die SEO-Komponente ausgegeben und bezieht Daten direkt aus der zentralen SITE-Konfiguration.

FAQPage-Schema Implementierung

Das FAQPage-Schema ist eines der wirkungsvollsten strukturierten Datenformate, weil es direkt sichtbare Rich Results in Google erzeugt. Die Implementierung in Astro nutzt die vorhandene FAQ-Datenstruktur und generiert das JSON-LD automatisch.

---
/* FAQPage JSON-LD Generierung aus dem FAQ-Daten-Array */
interface FaqItem {
  question: string;
  answer: string;
}

interface Props {
  items: FaqItem[];
}

const { items } = Astro.props;

/* Schema.org FAQPage strukturierte Daten */
const faqSchema = {
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": items.map((item) => ({
    "@type": "Question",
    "name": item.question,
    "acceptedAnswer": {
      "@type": "Answer",
      "text": item.answer,
    },
  })),
};
---

<!-- Sichtbares Accordion fur Nutzer -->
<section id="faq" class="faq">
  {items.map((item) => (
    <details class="faq__item">
      <summary class="faq__question">{item.question}</summary>
      <p class="faq__answer">{item.answer}</p>
    </details>
  ))}
</section>

<!-- Unsichtbares JSON-LD fur Suchmaschinen -->
<script
  type="application/ld+json"
  set:html={JSON.stringify(faqSchema)}
/>
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Welche Technologien verwenden Sie?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Wir arbeiten mit Astro, React, TypeScript und modernen CSS-Techniken. Alle Projekte folgen der Atomic-Design-Methodik."
      }
    },
    {
      "@type": "Question",
      "name": "Wie lange dauert ein typisches Projekt?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Je nach Umfang zwischen 2 und 8 Wochen. Ein Portfolio-Relaunch dauert typischerweise 3-4 Wochen."
      }
    },
    {
      "@type": "Question",
      "name": "Bieten Sie auch Wartung an?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Ja, wir bieten laufende Wartung, Sicherheitsupdates und Performance-Monitoring als monatlichen Service an."
      }
    }
  ]
}
Google-Suchergebnisse mit FAQPage Rich Result:

┌─────────────────────────────────────────────────┐
│  Arnold Wender — Webentwickler & Creator         │
│  https://arnoldwender.com                        │
│  Modernes Webdesign mit Astro, React und...      │
│                                                   │
│  ▸ Welche Technologien verwenden Sie?             │
│  ▸ Wie lange dauert ein typisches Projekt?        │
│  ▸ Bieten Sie auch Wartung an?                    │
└─────────────────────────────────────────────────┘

Jede Frage ist klickbar und expandiert die Antwort
direkt in den Suchergebnissen — ohne die Seite
besuchen zu mussen. Das verdreifacht die sichtbare
Flache deines Suchergebnisses.

Service-Schema fur die Leistungsseite

Das Service-Schema kommuniziert Google, welche Dienstleistungen angeboten werden. Jeder Service wird einzeln mit Name, Beschreibung und Anbieter-Referenz erfasst.

---
/* Service-Schema fur die Leistungsseite */
import { SITE } from '../../lib/constants';

const services = [
  {
    name: 'Webentwicklung',
    description: 'Individuelle Websites mit Astro, React und modernem CSS.',
  },
  {
    name: 'UI/UX Design',
    description: 'Benutzerzentriertes Design mit Atomic-Design-Methodik.',
  },
  {
    name: 'SEO-Optimierung',
    description: 'Technisches SEO, strukturierte Daten und Performance.',
  },
];

/* Jeder Service wird als eigenes Schema-Objekt erfasst */
const serviceSchemas = services.map((service) => ({
  "@context": "https://schema.org",
  "@type": "Service",
  "name": service.name,
  "description": service.description,
  "provider": {
    "@type": "Person",
    "name": SITE.author,
    "url": SITE.url,
  },
}));
---

{serviceSchemas.map((schema) => (
  <script
    type="application/ld+json"
    set:html={JSON.stringify(schema)}
  />
))}
[
  {
    "@context": "https://schema.org",
    "@type": "Service",
    "name": "Webentwicklung",
    "description": "Individuelle Websites mit Astro, React und modernem CSS. Performant, barrierefrei und SEO-optimiert.",
    "provider": {
      "@type": "Person",
      "name": "Arnold Wender",
      "url": "https://arnoldwender.com"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "Service",
    "name": "UI/UX Design",
    "description": "Benutzerzentriertes Design mit Atomic-Design-Methodik. Wireframes, Prototypen und Design-Systeme.",
    "provider": {
      "@type": "Person",
      "name": "Arnold Wender",
      "url": "https://arnoldwender.com"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "Service",
    "name": "SEO-Optimierung",
    "description": "Technisches SEO, strukturierte Daten und Core Web Vitals Performance-Optimierung.",
    "provider": {
      "@type": "Person",
      "name": "Arnold Wender",
      "url": "https://arnoldwender.com"
    }
  }
]

Die BreadcrumbList ist das Schema, das auf jeder einzelnen Seite generiert wird. Es beschreibt den Navigationspfad von der Startseite bis zur aktuellen Seite. In Astro fliesst diese Information uber eine elegante Prop-Kette von der Seite uber das Layout bis zur Breadcrumbs-Komponente.

Datenfluss der Breadcrumbs

  1. Breadcrumbs in der Seite definieren

    Jede Astro-Seite definiert ihre Breadcrumbs als Array von Objekten mit label und optionalem href. Die letzte Stufe hat keinen Link -- sie reprasentiert die aktuelle Seite.

  2. An BaseLayout ubergeben

    Die Seite ubergibt das Breadcrumbs-Array als Prop an das BaseLayout. BlogLayout und PortfolioLayout leiten diese Prop automatisch an BaseLayout weiter.

  3. Breadcrumbs-Komponente rendert HTML und JSON-LD

    Die Breadcrumbs-Molekul-Komponente rendert sowohl die sichtbare Navigation als HTML-Liste als auch das unsichtbare BreadcrumbList-Schema als JSON-LD-Script.

  4. Google zeigt den Pfad in der SERP

    Statt der nackten URL (arnoldwender.com/blog/json-ld) zeigt Google den lesbaren Pfad: Home > Blog > JSON-LD Strukturierte Daten. Das verbessert die Klickrate und Nutzerorientierung.

---
/* src/pages/leistungen.astro — Breadcrumbs fur die Leistungsseite */
import BaseLayout from '../layouts/BaseLayout.astro';

const breadcrumbs = [
  { label: 'Home', href: '/' },
  { label: 'Leistungen' },  /* Kein href = aktuelle Seite */
];
---

<BaseLayout
  seo={{ title: 'Leistungen', description: '...' }}
  breadcrumbs={breadcrumbs}
>
  <section id="leistungen">
    <!-- Seiteninhalt -->
  </section>
</BaseLayout>
---
/* src/components/molecules/Breadcrumbs.astro */
import type { BreadcrumbItem } from '../../types';

interface Props {
  items: BreadcrumbItem[];
}

const { items } = Astro.props;

/* BreadcrumbList-Schema generieren */
const breadcrumbSchema = {
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": items.map((item, index) => ({
    "@type": "ListItem",
    "position": index + 1,
    "name": item.label,
    ...(item.href && { "item": `${Astro.site}${item.href}` }),
  })),
};
---

<!-- Sichtbare Breadcrumb-Navigation -->
<nav aria-label="Breadcrumb" class="breadcrumbs">
  <ol class="breadcrumbs__list">
    {items.map((item, i) => (
      <li class="breadcrumbs__item">
        {item.href
          ? <a href={item.href}>{item.label}</a>
          : <span aria-current="page">{item.label}</span>
        }
      </li>
    ))}
  </ol>
</nav>

<!-- Strukturierte Daten fur Google -->
<script
  type="application/ld+json"
  set:html={JSON.stringify(breadcrumbSchema)}
/>
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://arnoldwender.com/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Blog",
      "item": "https://arnoldwender.com/blog"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "JSON-LD Strukturierte Daten"
    }
  ]
}

LocalBusiness fur Geo-Targeting

Das LocalBusiness-Schema ist essentiell fur jedes Unternehmen, das Kunden in einer bestimmten Region bedient. Es enthalt Firmenname, Adresse, Geo-Koordinaten und Kontaktdaten. Google nutzt diese Informationen fur den Knowledge Graph, lokale Suchergebnisse und Google-Maps-Einblendungen.

In diesem Portfolio werden die Geo-Daten zentral in der SITE-Konfiguration gepflegt und automatisch in das LocalBusiness-Schema ubertragen.

/* src/lib/constants.ts — Zentrale Konfiguration */
export const SITE: SiteConfig = {
  name: 'Arnold Wender',
  description: 'Webentwickler & Digitaler Creator',
  url: 'https://arnoldwender.com',
  locale: 'de',
  author: 'Arnold Wender',
  geo: {
    latitude: 51.4818,
    longitude: 11.9689,
    placeName: 'Halle (Saale), Germany',
    region: 'ST',
  },
};
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Arnold Wender — Webentwicklung",
  "description": "Webentwickler & Digitaler Creator",
  "url": "https://arnoldwender.com",
  "telephone": "+49-XXX-XXXXXXX",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Halle (Saale)",
    "addressRegion": "ST",
    "addressCountry": "DE"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 51.4818,
    "longitude": 11.9689
  },
  "areaServed": {
    "@type": "GeoCircle",
    "geoMidpoint": {
      "@type": "GeoCoordinates",
      "latitude": 51.4818,
      "longitude": 11.9689
    },
    "geoRadius": "50000"
  }
}
---
/* src/components/seo/SEO.astro — Auszug */
import { SITE } from '../../lib/constants';

/* LocalBusiness nur auf der Startseite */
const isHomepage = Astro.url.pathname === '/';

const localBusinessSchema = isHomepage && SITE.geo ? {
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": SITE.name,
  "description": SITE.description,
  "url": SITE.url,
  "address": {
    "@type": "PostalAddress",
    "addressLocality": SITE.geo.placeName,
    "addressRegion": SITE.geo.region,
    "addressCountry": "DE",
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": SITE.geo.latitude,
    "longitude": SITE.geo.longitude,
  },
} : null;
---

{localBusinessSchema && (
  <script
    type="application/ld+json"
    set:html={JSON.stringify(localBusinessSchema)}
  />
)}

Mehrsprachige strukturierte Daten

Bei mehrsprachigen Websites muss jede Sprachversion ihre eigenen strukturierten Daten generieren. Das bedeutet: Die deutsche Seite liefert deutsches JSON-LD, die englische Seite englisches JSON-LD, die spanische Seite spanisches JSON-LD. Suchmaschinen ordnen die strukturierten Daten der jeweiligen Sprachversion zu.

In Astro werden mehrsprachige Seiten uber die Ordnerstruktur (/de/, /en/, /es/) oder uber Content Collections mit einem locale-Feld verwaltet. Jede Sprachversion der Seite rendert ihr eigenes <script type="application/ld+json"> mit den ubersetzten Inhalten. Die Schema-Struktur (@type, @context) bleibt identisch — nur die menschenlesbaren Felder (name, description, text) werden ubersetzt.

Die Implementierung nutzt die Locale-Information aus dem Frontmatter oder der URL. FAQ-Fragen, Service-Beschreibungen und Breadcrumb-Labels kommen aus sprachspezifischen Daten-Dateien. Das Schema wird zur Build-Zeit fur jede Sprache separat generiert — es gibt keine dynamische Sprachumschaltung im JSON-LD.

Der haufigste Fehler ist das Mischen von Sprachen innerhalb eines JSON-LD-Blocks. Wenn die Seite auf Deutsch ist, mussen alle Texte im Schema ebenfalls Deutsch sein. Ein zweiter Fehler: vergessen, die inLanguage-Property zu setzen. Dritter Fehler: identische strukturierte Daten auf allen Sprachversionen — Google erkennt das als Duplikat.

Testen und Validieren

Strukturierte Daten zu implementieren ist nur die halbe Arbeit. Ohne systematisches Testen kannst du nicht sicher sein, dass Google deine Schemas korrekt interpretiert. Es gibt vier Werkzeuge, die du in deinem Workflow verwenden solltest.

Validierungs-Workflow

  1. Google Rich Results Test

    Das offizielle Google-Tool unter search.google.com/test/rich-results. Gib deine URL ein oder fuge HTML-Code ein. Es zeigt dir genau, welche Rich Results Google aus deinen strukturierten Daten erzeugen kann -- und meldet Fehler oder Warnungen.

  2. Schema.org Validator

    Unter validator.schema.org kannst du dein JSON-LD gegen die Schema.org-Spezifikation validieren. Dieses Tool ist strenger als Googles Test und pruft auch Felder, die Google selbst ignoriert. Ideal fur vollstandige Konformitat.

  3. Chrome DevTools Inspektion

    Offne die DevTools (F12), gehe zu Elements und suche nach <script type="application/ld+json">. Hier siehst du den tatsachlichen JSON-LD-Output deiner Seite. Prufe, ob die Daten korrekt sind, alle Felder vorhanden sind und keine JavaScript-Fehler die Generierung storen.

  4. Google Search Console

    Nach dem Deployment uberwachst du im Bereich "Verbesserungen" > "Rich Results" den Status deiner strukturierten Daten uber die Zeit. Google zeigt dir, welche Seiten Rich-Result-fahig sind, welche Fehler haben und wie sich die Impressionen entwickeln.

Haufige Fehler vermeiden

Die korrekte Implementierung strukturierter Daten erfordert Prazision. Kleine Fehler konnen dazu fuhren, dass Google dein Schema komplett ignoriert. Hier sind die haufigsten Stolperfallen und wie du sie vermeidest.

Aspekt Richtig Recommended Falsch
Schema pro Seite Ein FAQPage-Schema mit allen Fragen Mehrere FAQPage-Schemas auf derselben Seite
Pflichtfelder Alle required-Felder laut Schema.org Felder weglassen und hoffen, dass Google es akzeptiert
@type Schreibweise @type: "FAQPage" (exakt) @type: "faqpage" oder @type: "FAQ"
Inhalts-Ubereinstimmung JSON-LD-Text = sichtbarer Seiteninhalt Andere Texte im Schema als auf der Seite
Verschachtelung Flache Struktur, saubere @type-Zuweisungen Ubertiefe Verschachtelung ohne klare Hierarchie
Mehrere Schemas Separate <script>-Tags fur jeden Typ Alle Schemas in ein einzelnes <script>-Tag packen
Sprache inLanguage passend zur Seitensprache Kein inLanguage oder falsche Sprache angegeben

Sitemap-Integration

Strukturierte Daten und die Sitemap arbeiten Hand in Hand. Seiten mit reichhaltigen Schema-Auszeichnungen verdienen eine hohere Crawl-Prioritat, weil sie potenziell mehr Informationen fur den Google-Index liefern. In der Astro-Konfiguration wird dies uber ein abgestuftes Prioritaten-System umgesetzt.

Prioritat 1.0 — Startseite

Die Startseite enthalt Organization- und LocalBusiness-Schema. Hochste Crawl-Prioritat und tagliche Crawl-Frequenz.

Prioritat 0.9 — Kernseiten

Leistungen, Uber uns, Kontakt -- Seiten mit Service- und ContactPage-Schemas. Wochentliche Crawl-Frequenz.

Prioritat 0.8 — Blogartikel

Jeder Artikel hat ein Article-Schema mit Autor, Datum und Tags. Monatliche Crawl-Frequenz fur altere Posts.

Prioritat 0.7 — Portfolio

Projektseiten mit CreativeWork-Schema. Werden seltener aktualisiert, aber sind wichtig fur die Gesamtstruktur.

Prioritat 0.5 — Archive

Tag- und Kategorie-Seiten mit CollectionPage-Schema. Helfen Google, die Taxonomie zu verstehen.

Prioritat 0.3 — Suche

Suchseiten und Paginierung. Niedrige Prioritat, werden aber fur vollstandige Indexierung benotigt.

Haufig gestellte Fragen

Frequently Asked Questions

Zusammenfassung

Strukturierte Daten mit JSON-LD sind kein optionaler SEO-Bonus — sie sind ein fundamentaler Bestandteil moderner Web-Entwicklung. Sie kosten keine Performance, erfordern keinen Framework-Wechsel und konnen in Astro elegant in die bestehende Komponentenarchitektur integriert werden. Vier Schema-Typen — FAQPage, Service, BreadcrumbList und LocalBusiness — decken die wichtigsten Anwendungsfalle fur ein Portfolio oder eine Unternehmenswebsite ab.

Der Schlussel liegt in der Automatisierung: Strukturierte Daten sollten nicht manuell gepflegt werden, sondern sich aus den gleichen Datenquellen speisen wie die sichtbaren Inhalte. In Astro bedeutet das: Props und Content Collections fliessen in Komponenten, die sowohl das visuelle HTML als auch das unsichtbare JSON-LD rendern. Eine einzige Quelle der Wahrheit fur Mensch und Maschine.