© Liashko/Shutterstock.com
Kolumne: Die Golumne

Kolumne: Die Golumne


Naja, es geht nicht direkt um JavaScript, keine Panik. Doch die JavaScript Object Notation, kurz JSON, ist derzeit die Lingua Franca für den Datenaustausch im Internet. Eine Vielzahl von Web APIs, seien sie nun RESTful oder nicht, nutzen dieses Format für den Austausch von Daten. Andere Programme wiederum speichern ihre Daten sowohl als Textdateien oder in entsprechenden Datenbanken wie CouchDB in der JSON. Und auch für Konfigurationen wird JSON gerne genutzt.

Über Sinn und Unsinn dieses Formats mag ich hier nicht sinnieren. Es hat seine Vorteile, kann in unterschiedlichen Anwendungen jedoch auch durch individuell bessere Alternativen ersetzt werden. Wie dem auch sei – auch für Go-Entwickler ist JSON ein Thema [1]. Und so verwundert es nicht, dass das Package encoding/json [2] seit Anbeginn Bestandteil der Standardbibliothek ist. Hierbei fällt sehr angenehm auf, wie leicht dieses Paket zu nutzen ist. Als Beispiel sei an der Stelle folgendes Adressformat definiert.

type Address struct { Street string City string }

Was auffällt, ist die Notation der Felder in Versalien, sie werden also exportiert. Das ist notwendig, damit das mittels Reflection arbeitende Encoding die Felder auch erkennen kann. Insofern rate ich, für den Transfer von und zu JSON eigene Typen jenseits möglicher Typen mit eigenen Methoden zu verwenden. Das Marshalling selbst geht nun sehr einfach.

chancellery := Address{ Street: "Willi-Brandt-Straße 1", City: "10557 Berlin", } b, err := json.Marshal(chancellery)

Nun ist b vom Typ []byte und enthält das JSON ohne Umbrüche und Einrückungen.

{"Street": "Willi-Brand-Straße 1", "City": "10557 Berlin"}

Für einen Output mit Zeilenumbruch und Einrückungen stellt das Package die Funktion MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) zur Verfügung. So leicht wie die Wandlung der Go-Daten nach JSON ist auch Umwandlung eines JSON-Dokuments zurück nach Go.

var a Address err := json.Unmarshal(b, &a). 

Hier wird zuerst die entsprechende Variable erzeugt. Sie kann eine einfache Basisvariable oder (so wie hier) auch eine Struktur sein. Nur muss sie zu den Daten passen, denn sie stellt den Platz für die Unmarshal()-Funktion zur Verfügung und dient via Reflection als Muster.

Nun könnten die zum Marshalling gehörenden Byte-Slices sehr groß werden, je nach Komplexität der Typen oder Umfang der Daten. Ein Beispiel sei eine Abfrage einer größeren Menge an Daten aus einer Datenbank, um diese an einen anderen Service oder ein Web-Frontend zu übe...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang