Was ist JSON und wie wird es verwendet?

Veröffentlicht: 2022-08-14
Bild von „JSON“-Text, der auf einem Computermonitor eingeblendet ist
Maria Vonotna/Shutterstock.com

JSON (JavaScript Object Notation) ist ein standardisiertes Format zur Darstellung strukturierter Daten. Obwohl JSON aus der Programmiersprache JavaScript hervorgegangen ist, ist es heute eine allgegenwärtige Methode des Datenaustauschs zwischen Systemen. Die meisten modernen APIs akzeptieren JSON-Anforderungen und geben JSON-Antworten aus, daher ist es hilfreich, über gute Kenntnisse des Formats und seiner Funktionen zu verfügen.

In diesem Artikel erklären wir, was JSON ist, wie es verschiedene Datentypen ausdrückt und wie Sie es in gängigen Programmiersprachen erstellen und nutzen können. Wir werden auch einige der Einschränkungen von JSON und die entstandenen Alternativen behandeln.

JSON-Grundlagen

JSON wurde ursprünglich von Douglas Crockford als zustandsloses Format für die Datenübertragung zwischen Browsern und Servern entwickelt. In den frühen 2000er Jahren begannen Websites, nach dem anfänglichen Laden der Seite zusätzliche Daten asynchron von ihrem Server abzurufen. Als textbasiertes Format, das von JavaScript abgeleitet ist, hat JSON das Abrufen und Konsumieren von Daten in diesen Anwendungen vereinfacht. Die Spezifikation wurde schließlich 2013 als ECMA-404 standardisiert.

JSON wird immer als String übertragen. Diese Zeichenfolgen können in eine Reihe grundlegender Datentypen dekodiert werden, darunter Zahlen, boolesche Werte, Arrays und Objekte. Das bedeutet, dass Objekthierarchien und -beziehungen während der Übertragung erhalten und dann auf der Empfängerseite auf eine für die Programmierumgebung geeignete Weise wieder zusammengesetzt werden können.

Ein einfaches JSON-Beispiel

Dies ist eine JSON-Darstellung eines Blogbeitrags:

 {
    "id": 1001,
    "title": "Was ist JSON?",
    "Autor": {
        "ID": 1,
        "name": "James Walker"
    },
    "tags": ["api", "json", "programmierung"],
    "veröffentlicht": falsch,
    "publishedTimestamp": null
}

Dieses Beispiel zeigt alle JSON-Datentypen. Es veranschaulicht auch die Prägnanz von JSON-formatierten Daten, eine der Eigenschaften, die sie für die Verwendung in APIs so attraktiv gemacht hat. Darüber hinaus ist JSON im Gegensatz zu ausführlicheren Formaten wie XML relativ einfach zu lesen.

JSON-Datentypen

Sechs Arten von Daten können nativ in JSON dargestellt werden:

  • Strings – Strings werden zwischen doppelten Anführungszeichen geschrieben; Zeichen können mit Backslashes maskiert werden.
  • Zahlen – Zahlen werden als Ziffern ohne Anführungszeichen geschrieben. Sie können eine Bruchkomponente einfügen, um einen Float anzugeben. Die meisten JSON-Parsing-Implementierungen gehen von einer Ganzzahl aus, wenn kein Dezimalpunkt vorhanden ist.
  • Booleans – Die Literalwerte true und false werden unterstützt.
  • Null – Der null -Literalwert kann verwendet werden, um einen leeren oder weggelassenen Wert anzugeben.
  • Arrays – Ein Array ist eine einfache Liste, die durch eckige Klammern gekennzeichnet ist. Jedes Element in der Liste wird durch ein Komma getrennt. Arrays können eine beliebige Anzahl von Elementen enthalten und alle unterstützten Datentypen verwenden.
  • Objekte – Objekte werden durch geschweifte Klammern erstellt. Sie sind eine Sammlung von Schlüssel-Wert-Paaren, bei denen die Schlüssel Zeichenfolgen sind, die in doppelte Anführungszeichen eingeschlossen sind. Jeder Schlüssel hat einen Wert, der jeden der verfügbaren Datentypen annehmen kann. Sie können Objekte verschachteln, um kaskadierende Hierarchien zu erstellen. Auf jeden Wert muss ein Komma folgen, das das Ende dieses Schlüssel/Wert-Paares kennzeichnet.

JSON-Parser wandeln diese Datentypen automatisch in Strukturen um, die ihrer Sprache entsprechen. Sie müssen beispielsweise id nicht manuell in eine ganze Zahl umwandeln. Das Analysieren des gesamten JSON-Strings reicht aus, um Werte wieder ihrem ursprünglichen Datenformat zuzuordnen.

Semantik und Validierung

JSON hat bestimmte Regeln, die eingehalten werden müssen, wenn Sie Ihre Daten verschlüsseln. Zeichenfolgen, die sich nicht an die Syntax halten, können von Verbrauchern nicht geparst werden.

Achten Sie besonders auf Anführungszeichen um Zeichenfolgen und Objektschlüssel. Sie müssen auch sicherstellen, dass nach jedem Eintrag in einem Objekt oder Array ein Komma verwendet wird. JSON erlaubt jedoch kein abschließendes Komma nach dem letzten Eintrag – das unbeabsichtigte Einfügen eines ist eine häufige Ursache für Validierungsfehler. Die meisten Texteditoren heben Syntaxprobleme für Sie hervor und helfen so, Fehler aufzudecken.

Trotz dieser gemeinsamen Auslösepunkte ist JSON eines der Datenformate, die am einfachsten von Hand zu schreiben sind. Die meisten Leute finden die Syntax schnell und bequem, sobald sie sich damit vertraut gemacht haben. Insgesamt ist JSON tendenziell weniger fehleranfällig als XML, wo nicht übereinstimmende öffnende und schließende Tags, ungültige Schemadeklarationen und Zeichencodierungsprobleme häufig Probleme verursachen.

Benennen von JSON-Inhalten

Die Erweiterung .json wird normalerweise verwendet, wenn JSON in einer Datei gespeichert wird. JSON-Inhalte haben den standardisierten MIME-Typ application/json , obwohl aus Kompatibilitätsgründen manchmal text/json verwendet wird. Heutzutage sollten Sie sich auf application/json für Accept und Content-Type HTTP-Header verlassen.

Die meisten APIs, die JSON verwenden, kapseln alles in einem Objekt der obersten Ebene:

 {
    "Fehler": 1000
}

Dies ist jedoch nicht erforderlich – ein Literaltyp ist als Knoten der obersten Ebene in einer Datei gültig, daher sind die folgenden Beispiele auch alle gültige JSON:

 1000 
 Stimmt 
 Null

Sie decodieren in ihre jeweiligen Skalare in Ihrer Programmiersprache.

Arbeiten mit JSON

Die meisten Programmiersprachen verfügen über eine integrierte JSON-Unterstützung. So interagieren Sie mit JSON-Daten in einigen gängigen Umgebungen.

JavaScript

In JavaScript werden die JSON.stringify() und JSON.parse() verwendet, um JSON-Strings zu codieren und zu decodieren:

 konstanter Beitrag = {
    ID : 1001 ,
    Titel : "Was ist JSON?" ,
    Autor : {
        ID : 1 ,
        Name : "James Walker"
    }
} ;

const encodedJson = JSON. stringify ( posten ) ;

// {"id": 1001, "title": "Was ist JSON?", ...}
Konsole. log ( encodedJson ) ;

const decodedJson = JSON. parse ( encodedJson ) ;

// JamesWalker
Konsole. log ( decodiertJson. Autor . Name ) ;

PHP

Die äquivalenten Funktionen in PHP sind json_encode() und json_decode() :

 $post = [
    "id" => 1001 ,
    "title" => "Was ist JSON?" ,
    "Autor" => [
        "id" => 1 ,
        "name" => "James Walker"
    ]
] ;

$encodedJson = json_encode ( $post ) ;

// {"id": 1001, "title": "Was ist JSON?", ...}
echo $encodedJson ;

$decodedJson = json_decode ( $encodedJson , true ) ;

// JamesWalker
echo $decodedJson [ "Autor" ] [ "Name" ] ;

Python

Python bietet json.dumps() und json.loads() zum Serialisieren bzw. Deserialisieren:

 json importieren

Beitrag = {
    "ID" : 1001 ,
    "title" : "Was ist JSON?" ,
    "Autor" : {
        "id" : 1 ,
        "name" : "James Walker"
    }
}

codiertJson = json. Dumps ( Post )

# {"id": 1001, "title": "Was ist JSON?", ...}
drucken ( encodedJson )

decodedJson = json. lädt ( encodedJson )

#JamesWalker
print ( decodedJson [ "Autor" ] [ "Name" ] )

Rubin

Ruby bietet JSON.generate und JSON.parse :

 erfordern "json"

Beitrag = {
    "id" => 1001 ,
    "title" => "Was ist JSON?" ,
    "Autor" => {
        "id" => 1 ,
        "name" => "James Walker"
    }
}

codiertJson = JSON. erzeugen ( posten )

# {"id": 1001, "title": "Was ist JSON?", ...}
setzt encodedJson

decodedJson = JSON. parse ( encodedJson )

#JamesWalker
fügt decodedJson [ "Autor" ] [ "Name" ] ein

JSON-Einschränkungen

JSON ist ein einfaches Format, das sich darauf konzentriert, die Werte innerhalb Ihrer Datenstruktur zu übermitteln. Dies macht es schnell zu analysieren und einfach damit zu arbeiten, bedeutet aber auch, dass es Nachteile gibt, die zu Frustration führen können. Hier sind einige der größten Probleme.

Keine Kommentare

JSON-Daten dürfen keine Kommentare enthalten. Das Fehlen von Anmerkungen verringert die Übersichtlichkeit und zwingt Sie, die Dokumentation an anderer Stelle abzulegen. Dies kann dazu führen, dass JSON für Situationen wie Konfigurationsdateien ungeeignet wird, in denen Änderungen selten sind und der Zweck von Feldern unklar sein könnte.

Keine Schemas

Mit JSON können Sie kein Schema für Ihre Daten definieren. Es gibt beispielsweise keine Möglichkeit zu erzwingen, dass id ein erforderliches Integer-Feld ist. Dies kann zu unbeabsichtigt fehlerhaften Datenstrukturen führen.

Keine Referenzen

Felder können nicht auf andere Werte in der Datenstruktur verweisen. Dies führt häufig zu Wiederholungen, die die Dateigröße erhöhen. Um auf das Blog-Post-Beispiel von früher zurückzukommen, könnten Sie eine Liste von Blog-Posts wie folgt haben:

 {
    "Beiträge": [
        {
            "id": 1001,
            "title": "Was ist JSON?",
            "Autor": {
                "ID": 1,
                "name": "James Walker"
            }
        },
        {
            "id": 1002,
            "title": "Was ist SaaS?",
            "Autor": {
                "ID": 1,
                "name": "James Walker"
            }
        }
    ]
}

Beide Beiträge haben denselben Autor, aber die mit diesem Objekt verknüpften Informationen mussten dupliziert werden. In einer idealen Welt wären JSON-Parser-Implementierungen in der Lage, die oben gezeigte Struktur aus Eingaben zu erzeugen, die der folgenden ähneln:

 {
    "Beiträge": [
        {
            "id": 1001,
            "title": "Was ist JSON?",
            "Autor": "{{ .Autoren.James }}"
        },
        {
            "id": 1002,
            "title": "Was ist SaaS?",
            "Autor": "{{ .Autoren.James }}"
        }
    ],
    "Autoren": {
        "James": {
            "ID": 1,
            "name": "James Walker"
        }
    }
}

Dies ist derzeit mit Standard-JSON nicht möglich.

Keine erweiterten Datentypen

Die sechs unterstützten Datentypen lassen viele gängige Arten von Werten aus. JSON kann Daten, Uhrzeiten oder Geolokalisierungspunkte nicht nativ speichern, daher müssen Sie sich für ein eigenes Format für diese Informationen entscheiden.

Dies verursacht unangenehme Diskrepanzen und Grenzfälle. Wenn Ihre Anwendung Zeitstempel als Zeichenfolgen verarbeitet, z. B. 2022-07-01T12:00:00+00:00 , aber eine externe API die Zeit als Sekunden nach der Unix-Epoche darstellt – 1657287000 – müssen Sie sich merken, wann Sie die einzelnen verwenden Formate.

JSON-Alternativen

YAML ist die führende JSON-Alternative. Es ist eine Obermenge des Formats, das eine besser lesbare Darstellung, benutzerdefinierte Datentypen und Unterstützung für Verweise bietet. Es soll die meisten Usability-Herausforderungen im Zusammenhang mit JSON angehen.

YAML hat eine breite Akzeptanz für Konfigurationsdateien und in DevOps-, IaC- und Observability-Tools gefunden. Es wird weniger häufig als Datenaustauschformat für APIs verwendet. Die relative Komplexität von YAML bedeutet, dass es für Neulinge weniger zugänglich ist. Kleine Syntaxfehler können zu verwirrenden Analysefehlern führen.

Protokollpuffer (Protobufs) sind ein weiterer aufstrebender JSON-Anwärter, der zur Serialisierung strukturierter Daten entwickelt wurde. Protobufs haben Datentypdeklarationen, erforderliche Felder und Unterstützung für die meisten wichtigen Programmiersprachen. Das System wird immer beliebter als eine effizientere Methode zur Datenübertragung über Netzwerke.

Zusammenfassung

JSON ist ein textbasiertes Datendarstellungsformat, das sechs verschiedene Datentypen codieren kann. JSON ist zu einem festen Bestandteil des Softwareentwicklungs-Ökosystems geworden; Es wird von allen wichtigen Programmiersprachen unterstützt und ist zur Standardauswahl für die meisten REST-APIs geworden, die in den letzten zehn Jahren entwickelt wurden.

Während die Einfachheit von JSON Teil seiner Popularität ist, erlegt es auch Einschränkungen auf, was Sie mit dem Format erreichen können. Der Mangel an Unterstützung für Schemas, Kommentare, Objektreferenzen und benutzerdefinierte Datentypen bedeutet, dass einige Anwendungen feststellen werden, dass sie über die Möglichkeiten von JSON hinauswachsen. Jüngere Alternativen wie YAML und Protobuf haben dazu beigetragen, diese Herausforderungen anzugehen, während XML ein Anwärter für Anwendungen bleibt, die ein Datenschema definieren möchten und sich nicht um die Ausführlichkeit kümmern.