I have a Source[ByteString, _]
from an input file with 3 rows like this (in reality the input is a TCP socket with a continuos stream):
{"a":[2
33]
}
Now the problem is that I want to parse this into a Source[ChangeMessage,_]
, however the only examples I have found deals with when there is a whole JSON message for every row not when each JSON message can be fragmented over multiple rows.
One example I found is this this library, however it expects }
or ,
as last character, that is one JSON per row. The example below shows this setup.
"My decoder" should "decode chunked json" in {
implicit val sys = ActorSystem("test")
implicit val mat = ActorMaterializer()
val file = Paths.get("chunked_json_stream.json")
val data = FileIO.fromPath(file)
.via(CirceStreamSupport.decode[ChangeMessage])
.runWith(TestSink.probe[ChangeMessage])
.request(1)
.expectComplete()
}
Another alternative would be to use a fold and balance }
and only emit when a whole JSON is completed. The problem with this is that the fold operator only emits when the stream completes and since this is a continuous stream I can not use it here.
My question is: What is the fastest way to parse chunked JSON streams in AKKA Stream and are there any available software that already does this? If possible I would like to use circe