2016-08-06 34 views
2

我從服務器接收一些JSON:如何閱讀JSON字符串轉義引號中播放

"payload":"{\"action\":\"schedule\"}" 

爲什麼我得到這個奇怪的看着JSON看到this question。我已經寫了一些代碼來解析對象的此位:

implicit val botPayloadReads: Reads[BotPayload] = (
    (JsPath \ """\"action\"""").read[String] and 
     (JsPath \ """\"returnToAction"""").readNullable[String] 
    )(BotPayload.apply _) 

但我得到一個錯誤:

List((/entry(0)/messaging(0)/postback/payload/\"action\",List(ValidationError(List(error.path.missing),WrappedArray())))) 

這是一個有點古怪,因爲路徑\「動作\」是完全我們在尋找什麼。

+0

我覺得我只是需要去掉\\\\ s – Chris

+0

是的,就是這樣。 – Chris

回答

1

這些引號轉義的原因是"payload"鍵實際上有String類型,所以它包含對象的字符串表示形式。真的,這對於服務器來說是非常奇怪的。您基本上需要重新解析​​的值的內容,或者預處理JSON。不過,這可以通過Play的JSON API完成。

import play.api.data.validation.ValidationError 
import play.api.libs.json._ 
import scala.util.{ Success, Try } 

case class BotPayload(action: String, returnToAction: Option[String]) 

object BotPayload { 

    val payloadReads = Json.reads[BotPayload] 

    implicit val reads: Reads[BotPayload] = Reads.StringReads 
    .map(s => Try(Json.parse(s))) 
    .collect(ValidationError("Cound not parse content of payload")) { 
     case Success(js) => js 
    } 
    .andThen(payloadReads) 

} 

scala> val js = Json.parse(""" {"payload":"{\"action\":\"schedule\"}"} """) 
js: play.api.libs.json.JsValue = {"payload":"{\"action\":\"schedule\"}"} 

scala> (js \ "payload").validate[BotPayload] 
res0: play.api.libs.json.JsResult[BotPayload] = JsSuccess(BotPayload(schedule,None),) 
+0

我最終拉出了\但這看起來像一個很好的解決方案。服務器允許用戶將任何UTF-8字符串作爲Payload傳入,因此我們選擇JSON時會遇到這種情況。也許對於他們來說需要一個JSON對象會更有意義,因爲它總是坐在JSON對象的中間。 – Chris