Akka Streams Json Support
There are two main modules,
akka-stream-json is the basis and provides the stream-based parser while
akka-http-json enabled support to use the desired json library as an Unmarshaller.
libraryDependencies ++= List( "de.knutwalker" %% "akka-stream-json" % "3.3.0", "de.knutwalker" %% "akka-http-json" % "3.3.0" )
akka-stream-json depends on
jawn-parser at version
0.10.4 and is compiled against
akka-stream at version
2.4.17. The circe submodule depends on version
circe-jawn The Akk Http submodule depends on version
akka-stream-json is published for Scala 2.12 and 2.11.
The parser lives at
Use one of the constructor methods in the companion object to create the parser at various levels of abstraction, either a Stage, a Flow, or a Sink. You just add the jawn support facade of your choice and you will can parsed into their respective Json AST.
For Http support, either
import de.knutwalker.akka.http.JsonSupport._ or mixin
... with de.knutwalker.akka.http.JsonSupport.
Given an implicit jawn facade, this enable you to decode into the respective Json AST using the Akka HTTP marshalling framework. As jawn is only about parsing and does not abstract over rendering, you'll only get an Unmarshaller.
libraryDependencies ++= List( "de.knutwalker" %% "akka-stream-circe" % "3.4.0", "de.knutwalker" %% "akka-http-circe" % "3.4.0" )
(Using circe 0.8.0)
These support modules allow you to directly marshall from/unmarshall into your data types using circes
Encoder type classes.
Just mixin or import
de.knutwalker.akka.http.support.CirceHttpSupport for Http or pipe your
Source[ByteString, _].via(de.knutwalker.akka.stream.CirceStreamSupport.decode[A]) to get a
This flow even supports parsing multiple json documents in whatever fragmentation they may arrive, which is great for consuming stream/sse based APIs.
If there is an error in parsing the Json you can catch
de.knutwalker.akka.http.support.CirceStreamSupport.JsonParsingException. The exception provides Circe cursor history, current cursor and the type hint of the error.
Jawn provides a nice interface for asynchronous parsing. Most other Json marshalling provider will consume the complete entity at first, convert it to a string and then start to parse. With jawn, the json is incrementally parsed with each arriving data chunk, using directly the underlying ByteBuffers without conversion.
This code is open source software licensed under the Apache 2.0 License.