json-formatieren.de

Ratgeber · JSON 2026

JSON in REST-APIs: application/json, Versionen, Fehler-Schema

RFC 7807 (Problem Details) ist das Standard-Error-Format. application/problem+json statt eigener Konstrukte.

Foto von Jan-Tristan Rudat

Von Jan-Tristan Rudat

Redakteur json-formatieren.de

JSON ist heute der API-Default

99 % aller neu gebauten REST-APIs sprechen JSON. Die Content-Type-Header und Konventionen sind seit RFC 7159 (2014) und RFC 8259 (2017) stabil. Trotzdem gibt es ein paar Best-Practices, die nicht jeder kennt.

Pflicht-Header

HeaderWertWann
Content-Typeapplication/jsonbei Request- und Response-Bodies
Acceptapplication/jsonbei Client-Requests
Content-Type (Fehler)application/problem+jsonbei RFC 7807 Problem-Details

Wichtig: kein Charset-Suffix nötig - JSON ist immer UTF-8 nach RFC 8259.

RFC 7807: das Standard-Error-Format

Statt einer eigenen Error-Struktur sollte man RFC 7807 (Problem Details for HTTP APIs) nutzen:

HTTP/1.1 400 Bad Request
Content-Type: application/problem+json

{
  "type": "https://example.com/probs/validation",
  "title": "Validation failed",
  "status": 400,
  "detail": "The email field must be a valid address.",
  "instance": "/orders/12345",
  "errors": [
    { "field": "email", "code": "invalid_format" }
  ]
}

Pflichtfelder: type (URI-Referenz auf eine Doku-Seite), title (kurze Beschreibung), status (HTTP-Code). Plus beliebige Extensions. Wird von Spring, FastAPI, NestJS und Co. nativ unterstützt.

Versionierung

Drei verbreitete Varianten - keine ist offiziell empfohlen, alle drei haben ihre Anhänger:

StilBeispielVorteilNachteil
URL-Pfad/api/v2/ordersextrem klar sichtbarCode-Pollution mit Versions-Strings
HeaderX-API-Version: 2URLs bleiben saubernicht in Browser-URL sichtbar
Accept-Vendorapplication/vnd.acme.v2+jsonRFC-konformkomplex zu testen mit curl

Pragmatische Empfehlung: URL-Pfad, weil 90 % der API-Konsumenten Browser-/Postman-User sind und das einfacher debuggen können.

Pagination-Conventions

Drei populäre Patterns für JSON-Pagination:

  • Link-Header (RFC 5988): rel="next", rel="prev" - GitHub-Stil, kein Body-Overhead
  • Envelope mit meta: { data: [...], meta: { total, page, perPage, hasNext } }
  • Cursor-basiert: opake String als nextCursor - robust gegen Inserts

Status-Codes & Body-Pattern

StatusBody
200 OKDaten oder Envelope
201 Createderzeugte Ressource + Location-Header
204 No Contentleer (auch für DELETE)
400 Bad RequestProblem Details (RFC 7807)
401 UnauthorizedProblem Details
404 Not FoundProblem Details
422 Unprocessable EntityProblem Details mit field-level errors
500 Internal Server Errorgenerisches Problem Details, keine Stack-Traces

Date-Format

ISO 8601 mit Zeitzone. Konvention: UTC mit "Z"-Suffix wenn keine Lokalzeit wichtig ist.

"createdAt": "2026-05-14T12:34:56Z"
"birthDate": "1990-03-15"          // nur Datum, ohne Zeit

Keine Unix-Timestamps in der Public-API - sie sind weniger lesbar und brauchen Konventionen für Sekunden vs Millisekunden.

Nullable Fields

Vier Optionen einen "leeren" Wert zu repräsentieren:

  1. Key komplett weglassen
  2. Key mit null
  3. Key mit leerem String
  4. Key mit leerem Array oder Object

Konvention: 1 und 2 sind semantisch unterschiedlich. "Key fehlt" = "nicht bekannt", "Key=null" = "bewusst leer". 3 und 4 nur wenn Typ stabil bleiben muss. Im JSON Schema mit "type": ["string", "null"] explizit machen.

Mehr zum Thema