Scala Play 解析 json 流 (ndjson)
Scala Play parse json stream (ndjson)
我有一个生成 application/stream+json
或 application/x-ndjson
(http://ndjson.org/) 的端点。
我正在尝试通过 Play 使用此端点。具体来说,我使用了 WSResponse.json
但它似乎只解析返回的第一项。我也试过 WSResponse.validate[Seq[JsValue]]
但失败 JsonValidationError
.
是否可以使用 Play 解析此输出并获得 Seq
甚至 Source
(akka-streams)?
我设法根据 cchantep 的评论创建了一个解决方案
使用 akka-streams framing,特别是 class JsonFraming
就可以了。我最终得到了这样的结果:
// declaration or injection of WSClient
ws.url(url)
.post(body)
.flatMap { response =>
for {
jsonStrs <- response.bodyAsSource.via(JsonFraming.objectScanner(Int.MaxValue))
.runFold(Seq.empty[String]) {
case (acc, entry) => acc ++ Seq(entry.utf8String)
}
} yield {
jsons.map(Json.parse)
}
}
上面的代码将生成一个 Future[Seq[JsValue]]
,可以根据需要对其进行操作。
我有一个生成 application/stream+json
或 application/x-ndjson
(http://ndjson.org/) 的端点。
我正在尝试通过 Play 使用此端点。具体来说,我使用了 WSResponse.json
但它似乎只解析返回的第一项。我也试过 WSResponse.validate[Seq[JsValue]]
但失败 JsonValidationError
.
是否可以使用 Play 解析此输出并获得 Seq
甚至 Source
(akka-streams)?
我设法根据 cchantep 的评论创建了一个解决方案
使用 akka-streams framing,特别是 class JsonFraming
就可以了。我最终得到了这样的结果:
// declaration or injection of WSClient
ws.url(url)
.post(body)
.flatMap { response =>
for {
jsonStrs <- response.bodyAsSource.via(JsonFraming.objectScanner(Int.MaxValue))
.runFold(Seq.empty[String]) {
case (acc, entry) => acc ++ Seq(entry.utf8String)
}
} yield {
jsons.map(Json.parse)
}
}
上面的代码将生成一个 Future[Seq[JsValue]]
,可以根据需要对其进行操作。