json - 如何在 Play 中读取带有转义引号的 JSON 字符串

标签 json scala playframework

我正在从服务器接收一些 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()))))

这有点奇怪,因为路径“action”正是我们正在寻找的。

最佳答案

这些引号被转义的原因是 "payload" 键实际上具有 String 类型,因此它包含对象的字符串表示形式。这对于服务器返回来说非常奇怪,真的。您基本上需要重新解析 payload 值的内容,或预处理 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),)

关于json - 如何在 Play 中读取带有转义引号的 JSON 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38804756/

相关文章:

java - 玩!框架 Java 项目与 Sencha ExtJS 集成?

javascript - 开始使用 sigma 示例 - 无法让它工作

java - 检索字段列表中描述的对象字段

javascript - NodeJS Json 数据未完全插入数据库

Scala while(true) 类型不匹配? scala 中的无限循环?

scala - 使用 IDEA 和 SBT 配置 Play 2.0 应用

javascript - 在Javascript的另一个页面中获取JSON信息

scala - Scala 中间件选择之间有何区别?

scala - 使用 “When Otherwise”时增长超过64 KB错误

java - Play 2.5 元素中损坏的 CSS 链接