JSON (JavaScript Object Notation) ist ein äußerst vielseitiges und äußerst beliebtes Datenformat. Es wird häufig für die Kommunikation zwischen Web-Apps und auch als bequeme Möglichkeit zum Speichern großer Mengen strukturierter Anwendungsdaten verwendet.
JSON ist so nützlich, dass fast alle modernen Programmiersprachen eine integrierte Unterstützung für die Arbeit damit bieten, einschließlich Go.
Arbeiten mit JSON in Go
Sie können den größten Teil der Arbeit, die Sie mit JSON erledigen, in zwei allgemeine Kategorien aufteilen: Marshalling und Unmarshaling. Wikipedia definiert Marshalling als:
In der Informatik ist Marshalling der Prozess der Umwandlung der Speicherdarstellung eines Objekts in ein Datenformat, das für die Speicherung oder Übertragung geeignet ist. Es wird normalerweise verwendet, wenn Daten zwischen verschiedenen Teilen eines Computerprogramms oder von einem Programm zu einem anderen verschoben werden müssen.
Einfacher ausgedrückt ist Marshalling der Prozess, in einer Variablen gespeicherte Daten in eine Form umzuwandeln, die einfacher an ein anderes Programm übergeben werden kann. Unmarshaling ist der umgekehrte Prozess: Es beinhaltet, Daten zu nehmen, die für den Transport formatiert sind, und sie in eine Form umzuwandeln, die für Ihr Programm einfacher zu verwenden ist.
Mit Go können Sie native Datenstrukturen in JSON marshallen. Und Sie können die umgekehrte Aktion ausführen und JSON-Daten in Go-Variablen entpacken.
Marshalling zu JSON in Go
Go bietet die encoding/json-Paket um Ihnen die Arbeit mit JSON zu erleichtern. Dieses Paket enthält mehrere Funktionen, aber diejenige, die Sie zum Marshallen verwenden werden, ist die Marschall Funktion. Marschall hat die folgende Funktionssignatur:
func Marschall (v Schnittstelle{}) ([]Byte, Fehler)
Das bedeutet, dass Marschall akzeptiert einen Parameter eines beliebigen Datentyps und gibt zwei Werte zurück: einen Byte-Slice und einen Fehler. Mit anderen Worten, Sie rufen an Marschall mit einem Go-Wert, konvertiert es in JSON und gibt das JSON-Äquivalent zurück. Wenn während des Konvertierungsprozesses ein Fehler auftritt, wird der Fehler und ein leeres Slice zurückgegeben.
Hier ist ein Codebeispiel, das verwendet Marschall um eine Karte in JSON zu konvertieren. Um dieses Beispiel auszuführen, müssen Sie lediglich eine Go-Datei in erstellen Ihr Lieblings-Code-Editor, oder verwenden Sie die Spielplatz gehen:
Paket hauptsächlich
importieren (
"Kodierung/json"
"fmt"
)Funk hauptsächlich(){
val := map[string]int{
"John": 25,
"Maria": 19,
"Adam": 5,
}
res, _ := json. Marschall (val)
fmt.Println(Schnur(res))
}
Wenn Sie diesen Code ausführen, wird Folgendes ausgegeben:
Wie bereits erwähnt, können Sie jede Art von Go-Daten in JSON marshallen, obwohl Sie im wirklichen Leben normalerweise Strukturen marshallt. Aus diesem Grund bietet Go eine Funktion namens Struktur-Tags, die Sie geben können Marschall zusätzliche Anweisungen zum Konvertieren Ihrer Strukturen.
Ein Struct-Tag ist eine Zeichenfolge, die Sie in Ihre Struct-Deklaration neben dem Datentyp eines Felds einfügen. Mit Struct-Tags können Sie die Art und Weise anpassen Marschall behandelt das Feld, zu dem das Tag gehört. Sie können Struct-Tags verwenden, um ein Feld in der JSON-Ausgabe umzubenennen oder es sogar ganz wegzulassen. Struct-Tags (das Marschall erkennt) beginnen mit dem Teilstring "json:".
Angenommen, Sie haben eine Struktur Auto das einige Informationen über ein Auto darstellt. Hier ist der Code zum Erstellen einer Auto und marshall es in JSON:
Paket hauptsächlich
importieren (
"Kodierung/json"
"fmt"
)
Funk hauptsächlich(){
Typ Autostruktur {
Markenschnur
Modell-String
Preis int
}
val := Auto{Marke: "Mercedes", Modell: "Benz", Preis: 50000}
res, _ := json. Marschall (val)
fmt.Println(Schnur(res))
}
Dieser Code erzeugt die Ausgabe:
Der Marke, Modell, Und Preis Felder von Auto müssen mit Großbuchstaben beginnen, oder Marschall kann sie nicht umwandeln. Dies führt dazu, dass die JSON-Ausgabefelder ebenfalls mit Großbuchstaben beginnen. Was aber, wenn Sie möchten, dass die Namen im JSON mit Kleinbuchstaben beginnen, oder wenn Sie ein Feld komplett umbenennen möchten? Hier kommen die struct-Tags ins Spiel. Hier ist ein Beispiel:
Paket hauptsächlich
importieren (
"Kodierung/json"
"fmt"
)
Funk hauptsächlich(){
Typ Autostruktur {
ID int `json:"-"`
Markenstring `json:"Typ"`
Modellstring `json:"Modell"`
Preis int `json:"Preis"`
}
val := Auto{ID: 0, Marke: "Mercedes", Modell: "Benz", Preis: 50000}
res, _ := json. Marschall (val)
fmt.Println(Schnur(res))
}
Dieser Code führt ein neues ID-Feld ein, das Marschall aus der JSON-Ausgabe über ein Struct-Tag auslässt. Der Code verwendet auch Struct-Tags, um die anderen Struct-Felder umzubenennen. Hier ist die Programmausgabe:
Wie Sie sehen können, wird der Teil des struct-Tags nach „json:“ zum Namen des Felds in der Ausgabe von Marshal. Es gibt eine Ausnahme: Wenn es sich um die Zeichenfolge "-" handelt, lässt Marshal dieses Feld aus der Ausgabe aus. Weitere Informationen zu Marshal- und Struktur-Tags finden Sie in der Gehen Sie Dokumentation.
Unmarshaling von JSON in Go
Das Paket encoding/json bietet auch eine Unmarshaling-Funktion namens Unmarschall. Es hat die folgende Funktionssignatur:
func Unmarshal (data []byte, v Schnittstelle{}) Fehler
nicht wie Marschall, Unmarschall gibt keinen Wert zurück. Stattdessen akzeptiert es JSON als Byte-Slice im ersten Argument und speichert dann die konvertierten Daten in dem Objekt, auf das das zweite Argument zeigt. Unmarschall funktioniert auch mit struct-Tags, aber hier sagen die Tags Unmarschall welche JSON-Felder mit welchen Strukturfeldern übereinstimmen.
Beim Unmarshaling in einem Programm könnten Sie Daten von einer API abrufen, aber hier verwenden Sie Dummy-Daten. Hier ist, wie Sie verwenden Unmarschall:
Paket hauptsächlich
importieren (
"Kodierung/json"
"fmt"
)Funk hauptsächlich(){
Typ Autostruktur {
ID int `json:"-"`
Markenstring `json:"Typ"`
Modellstring `json:"Modell"`
Preis int `json:"Preis"`
}jsonInput := `{
"Typ": "Toyota",
"Modell": "Camry",
"Preis": 2000
}`Var jsonAusgabeauto
Fehler := json. Unmarshall([]Byte(jsonEingabe), &jsonAusgabe)wenn err != nil {
fmt. Println("JSON-Decodierungsfehler!")
zurückkehren
}
fmt.Println(jsonAusgabe)
}
Dieser Code verwendet denselben Car-Typ wie das vorherige Beispiel und entpackt ein JSON-Objekt in eine Struktur vom Typ Car und druckt dann die Daten in der Struktur. Wenn es ausgeführt wird, erzeugt das Programm diese Ausgabe:
Dies zeigt, dass die Dummy-JSON-Daten erfolgreich in die entpackt wurden jsonAusgabe Struktur.
Go macht es einfach, mit JSON zu arbeiten
Mit dem encoding/json-Paket ist die Arbeit mit JSON in Go so einfach wie zwei Funktionsaufrufe: Marsha und Unmarshal. Mit Go können Sie auch den Prozess des Marshalling/Unmarshaling von JSON mit Struktur-Tags anpassen.
Das Konvertieren von Daten in JSON ist eine großartige Möglichkeit, sie mit einem anderen Programm oder Prozess zu teilen. Das Format ist so universell, dass JSON so portabel wie möglich ist.