gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:57:52 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com