Scala 在Play框架中返回ReactiveMongo JSON
从BSONArray返回JSON文本的最快方法是什么 我将返回非常大的JSON文档。是否可以省略处理Scala 在Play框架中返回ReactiveMongo JSON,scala,reactivemongo,play-reactivemongo,Scala,Reactivemongo,Play Reactivemongo,从BSONArray返回JSON文本的最快方法是什么 我将返回非常大的JSON文档。是否可以省略处理PlayJsValue 现在我就这样回来了: val result:BSONArray = .... Ok(Json.toJson(result)) 我认为更快应该是这样的: Ok(result.toTextJSON).as(MimeTypes.JSON) 在此更新我的完整代码: val command = Json.parse( s""" { "aggregate": "$coll
Play
JsValue
现在我就这样回来了:
val result:BSONArray = ....
Ok(Json.toJson(result))
我认为更快应该是这样的:
Ok(result.toTextJSON).as(MimeTypes.JSON)
在此更新我的完整代码:
val command = Json.parse( s""" {
"aggregate": "$collection",
"pipeline": [
{ "$$match": { "$$and" : [
{ "${RootAttrs.TIME}" : { "$$gt": $startSecTime }},
{ "${RootAttrs.TIME}" : { "$$lt": $endSecTime }},
{ "${RootAttrs.COMMAND}" : { "$$eq": ${toCmd(Command.GPS_COORDINATES)} }}
]
}},
{ "$$sort": { "${RootAttrs.TIME}" : 1 }},
{ "$$limit": $MAX_GPS_ALL_DATA },
{ "$$project" : { "_id":0, "${RootAttrs.TIME}":1, "${RootAttrs.COMMAND}":1, "${RootAttrs.VALUE}":1, "${RootAttrs.IGNITION}":1, "${RootAttrs.SIM_NUMBER}":1 } }
]}""")
db.command(RawCommand(BSONDocumentFormat.reads(command).get)).map { out =>
out.get("result").map {
case result: BSONArray =>
Logger.debug("Loaded all GPS history data size: " + result.length)
Ok(Json.toJson(result)) // <- I need just return JSON, parsing to JsValue can take some time
case _ =>
Logger.error("Result GPS history data not array")
BadRequest
}.getOrElse(BadRequest)
}
val命令=Json.parse{
“聚合”:“$collection”,
“管道”:[
{“$$match”:{“$$and”:[
{“${RootAttrs.TIME}”:{“$$gt”:$startSetTime},
{“${RootAttrs.TIME}”:{“$$lt”:$endSecTime},
{${RootAttrs.COMMAND}:{$$eq:${toCmd(COMMAND.GPS_坐标)}}
]
}},
{$$sort:{${RootAttrs.TIME}:1},
{“$$limit”:$MAX\U GPS\U ALL\U DATA},
{$$project:{“{u id”:0,${RootAttrs.TIME}”:1,${RootAttrs.COMMAND}”:1,${RootAttrs.VALUE}”:1,${RootAttrs.IGNITION}:1,${RootAttrs.SIM_NUMBER}:1}
]}""")
command(RawCommand(BSONDocumentFormat.reads(command.get)).map{out=>
out.get(“结果”).map{
案例结果:BSONArray=>
Logger.debug(“加载的所有GPS历史数据大小:”+结果.length)
Ok(Json.toJson(result))//
记录器错误(“结果GPS历史数据不是阵列”)
坏请求
}.getOrElse(BadRequest)
}
如果要创建自己的可写文件,可以绕过创建中间JsValue的步骤,并更手动地输出字符串
下面是一个简单的例子,可以根据您的需要进行定制
val result: BSONArray = BSONArray("one", "two", "three")
def convertBsonArrayToString(jsval: BSONArray): Array[Byte] = {
// this method assumes I have a BSONArray of Strings (which you may not)
var strs: Stream[String] = jsval.stream.map(_.get match { case s: BSONString => s.value })
var json: String = strs.mkString("[\"", "\",\"", "\"]")
json.getBytes()
}
implicit def writeableOf_BSONArray: Writeable[BSONArray] = {
Writeable(convertBsonArrayToString ,Some("application/json"))
}
def doStuff = action {
Results.Ok(result)
}
上述答复是[“一”、“二”、“三”]
如果您正在处理海量数据,那么最好使用枚举器并将响应流化
请看:您能在这里添加一个更全面的代码示例吗?在我看来,这就像是重新发明轮子。