2016-07-21 7 views
0

Каков самый быстрый способ вернуть текст JSON из BSONArray?Return ReactiveMongo JSON в Play Framework

Я возвращаю очень большой документ JSON. Можно ли пропустить обработку PlayJsValue

Теперь я возвращаюсь, как это:

val result:BSONArray = .... 
Ok(Json.toJson(result)) 

я думаю быстрее будет что-то вроде:

Ok(result.toTextJSON).as(MimeTypes.JSON) 

Update здесь мой полный код:

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) 
} 
+0

Не могли бы вы добавить более полный пример кода здесь? – marcospereira

ответ

-1

Вы можете обойти шаг создания посредника JsV alue, если вы хотите создать свой собственный Writeable и вывести строку более вручную.

Вот простой пример, который может быть настроен для вашей потребности

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) 
} 

Ответ выше [ «один», «два», «три»]

Если вы имеете дело с массовым данных - вам также может быть лучше использовать Enumerator и потоковой передачи ответа.

см: https://www.playframework.com/documentation/2.5.x/ScalaStream

+0

Мне кажется, как изобретать колесо. – cchantep