Beliebte Suchanfragen
//

JSON mit Akka HTTP

22.11.2016 | 6 Minuten Lesezeit

In diesem Artikel wird die Nutzung von JSON mit Akka HTTP thematisiert.

Dabei verfolgen wir zunächst eine Umsetzung, die sich an der aktuellen Dokumentation von Akka orientiert und nutzen spray-json . Im Anschluss zeigen wir einen alternativen Ansatz mit akka-http-json und circe .

Die Domäne

Die Domäne wird hier bewusst einfach gehalten, da der Fokus auf Parsing und Mapping liegt:

Neben diesen Case-Classes existieren noch die Aufzählungstypen Gender und CustomerType. Obwohl es nachteilig ist, Aufzählungen als Erweiterung von Enumeration zu implementieren (ein Artikel dazu hier ), wird CustomerType hier so umgesetzt, um alle Eventualitäten abzudecken. Ein Grund dafür kann bspw. der Umgang mit Legacy-Code sein.

Gender wird als sealed Trait umgesetzt.

Server

Für das Beispiel existiert ein einfacher Server, dessen Routing durch paths definiert wird. POST-Requests werden unter http://localhost:8080/customer entgegengenommen. Das übertragene Objekt wird zunächst in der Konsole ausgegeben, anschließend customers hinzugefügt und schließlich wird die aktualisierte Liste hinzugefügt. GET liefert für eine bestimmte UUID das entsprechende Element der Map zurück.

JSON-Support mit spray-json

Dieser Abschnitt orientiert sich an der Dokumentation zur Nutzung von JSON im Kontext von Akka HTTP 2.4.11. Um spray-json im Beispielprojekt einzubinden, wird folgende Dependency verwendet:

Um den Server JSON-fähig zu gestalten, bedarf es noch der Einbindungen der notwendigen Kapazitäten für spray-json sowie der Definition eines JSON-Protokolls. Dazu werden im Trait JsonSupport das JSON-Format für Address und Customer definiert. Ersteres wird mit dem Aufruf jsonFormat4(Address) erreicht – die vier steht für die Anzahl der Parameter im Konstruktor. Das Format für Customer wird äquivalent behandelt.

Der Trait JsonSupport wird in Main.scala hinein gemixt:

Custom-Types

Grundsätzlich würden diese Implementierungsschritte ausreichen, jedoch deckt DefaultJsonProtocol nicht alle Typen ab, die hier verwendet werden. Im vorliegenden Fall benötigen wir Formate für:

  • java.util.UUID
  • java.time.LocalDate
  • oben beschriebene Aufzählungen

Dazu wird das im Trait CustomerJsonProtocol für jedes benötige Format ein impliziter Wert des Types JsonFormat angelegt und dessen Methoden read und write implementiert.

Im Trait JsonSupport wird dieser Trait anstelle von DefaultJsonProtocol verwendet:

JSON mit akka-http-json und circe

Alternativ zu spray-json existieren weitere Bibliotheken, um JSON im Kontext von Akka HTTP zu nutzen. Eine davon ist akka-http-json, die hier mit circe verwendet wird. Dazu wird folgende Dependency (anstelle der Dependency für spray-json) eingebunden:

Die erste Dependency bindet die Integration von circe in Akka HTTP, die maßgeblich mittels CirceSupport zur Verfügung gestellt wird, ein. circe-generic ermöglicht die automatische Erzeugung von Codecs (analog Formaten bei spary-json) zur Compile-Time. circe-java8 beinhalten Codecs für spezielle Typen von Java 8, insbesondere LocalDate.

Um also circe zu nutzen, wird Main.scala folgendermaßen angepasst:

Im Companion Object für CustomerType werden Decoder und Encoder als implizite Werte angelegt:

Für Gender wird analog vorgegangen. In der vorliegende Version (0.5.2) von circe, die hier verwendet wird, sollten ADTs automatisch, jedoch gab es hierbei Probleme, die nicht gelöst werden konnten. Außerdem weicht der JSON-Output ab, so dass ein eigener Codec benötigt wird. Mit kann circe 0.6 kann dieser aber konfiguriert werden.

Für java.util.UUID sind dank circe-java8 bereits Mechanismen vorhanden und müssen nicht wie bei spray-json implementiert werden.

Fazit

JSON kann mit wenig Aufwand in einem auf Akka HTTP basierenden Server eingebunden werden. Ob nun spray-json, circe oder eine andere Bibliothek verwendet wird, hängt nicht nur vom Gusto des Entwicklers ab, sondern selbstverständlich von der Qualität, dem Funktionsumfang sowie wie die Pflege und Weiterentwicklung der jeweiligen Bibliothek. Persönlich erscheint circe umfangreicher als spray-json zu sein.

Das Repository mit den Projekten für circe und spray-json befindet sich hier .

//

Weitere Artikel in diesem Themenbereich

Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.

//
Jetzt für unseren Newsletter anmelden

Alles Wissenswerte auf einen Klick:
Unser Newsletter bietet dir die Möglichkeit, dich ohne großen Aufwand über die aktuellen Themen bei codecentric zu informieren.