From 46415893aac6285673b6a122767b6a097ccd3874 Mon Sep 17 00:00:00 2001 From: Roman Filonenko Date: Fri, 13 Sep 2019 02:42:22 +0200 Subject: [PATCH] fix JsonFraming to accept multiple top-level arrays (#26098) (#26099) --- .../stream/scaladsl/JsonFramingSpec.scala | 24 +++++++++++++++++++ .../akka/stream/impl/JsonObjectParser.scala | 7 +++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/akka-stream-tests/src/test/scala/akka/stream/scaladsl/JsonFramingSpec.scala b/akka-stream-tests/src/test/scala/akka/stream/scaladsl/JsonFramingSpec.scala index d177cfe56ba..a7249f026ab 100644 --- a/akka-stream-tests/src/test/scala/akka/stream/scaladsl/JsonFramingSpec.scala +++ b/akka-stream-tests/src/test/scala/akka/stream/scaladsl/JsonFramingSpec.scala @@ -44,6 +44,30 @@ class JsonFramingSpec extends AkkaSpec { """{ "name" : "jack" }""") } + "parse multiple arrays" in { + val input1 = + """ + |[ + | { "name" : "john" } + |] + |""".stripMargin + + val input2 = + """ + |[ + | { "name" : "jack" } + |] + |""".stripMargin + + val result = Source(List(ByteString(input1), ByteString(input2))) + .via(JsonFraming.objectScanner(Int.MaxValue)) + .runFold(Seq.empty[String]) { + case (acc, entry) => acc ++ Seq(entry.utf8String) + } + + result.futureValue shouldBe Seq("""{ "name" : "john" }""", """{ "name" : "jack" }""") + } + "emit single json element from string" in { val input = """| { "name": "john" } diff --git a/akka-stream/src/main/scala/akka/stream/impl/JsonObjectParser.scala b/akka-stream/src/main/scala/akka/stream/impl/JsonObjectParser.scala index 35094daa741..44902e21ea0 100644 --- a/akka-stream/src/main/scala/akka/stream/impl/JsonObjectParser.scala +++ b/akka-stream/src/main/scala/akka/stream/impl/JsonObjectParser.scala @@ -116,7 +116,8 @@ import scala.annotation.switch trimFront += 1 } else if (input == SquareBraceEnd && outsideObject) { // outer array completed! - pos = -1 + pos += 1 + trimFront += 1 } else if (input == Comma && outsideObject) { // do nothing pos += 1 @@ -137,9 +138,7 @@ import scala.annotation.switch isStartOfEscapeSequence = false depth -= 1 pos += 1 - if (depth == 0) { - completedObject = true - } + if (depth == 0) completedObject = true } else if (isWhitespace(input) && !inStringExpression) { pos += 1 if (depth == 0) trimFront += 1