Play Framework - 从版本 2.3.x 迁移到 2.4.1:如何确定 JSON 值是否为 JsUndefined
Play Framework - migration from version 2.3.x to 2.4.1: how to determine whether a JSON value is JsUndefined
我正在尝试将我的 Play 应用程序从版本 2.3.8 迁移到 2.4.1...但我仍然面临一些问题。
我使用 play-json-zipper
,它总是 returns a JsValue
... 因此以下语句不适用于 Play 2.4.1:
import play.api.libs.json._
import play.api.libs.json.extensions._
val json = JsObject(...)
val v = json.get(__ \ 'key) match { // json.get returns a JsValue
case _: JsUndefined => Seq[JsValue]()
case js: JsValue => js.as[JsArray].value
}
在 Play 2.4.1 中,JsUndefined
没有继承自 JsValue
(它们都继承自 JsReadable
)。我的代码非常庞大……删除 play-json-zipper
意味着需要付出相当大的努力。是否有解决方法来确定 json.get(__ \ 'key)
返回的 JsValue
是否未定义?
这很有趣。 commit 表示 "JsUndefined should not be a JsValue"。这很公平,我认为使用 Some/None 方法更有意义。
如果你想完全按照你写的那样做,可以使用这样的东西:
val v: Seq[JsValue] = (json \ "key").toOption.map {
case JsArray(els) => els
case _ => Seq[JsValue]()
} getOrElse(Seq[JsValue]())
我正在尝试将我的 Play 应用程序从版本 2.3.8 迁移到 2.4.1...但我仍然面临一些问题。
我使用 play-json-zipper
,它总是 returns a JsValue
... 因此以下语句不适用于 Play 2.4.1:
import play.api.libs.json._
import play.api.libs.json.extensions._
val json = JsObject(...)
val v = json.get(__ \ 'key) match { // json.get returns a JsValue
case _: JsUndefined => Seq[JsValue]()
case js: JsValue => js.as[JsArray].value
}
在 Play 2.4.1 中,JsUndefined
没有继承自 JsValue
(它们都继承自 JsReadable
)。我的代码非常庞大……删除 play-json-zipper
意味着需要付出相当大的努力。是否有解决方法来确定 json.get(__ \ 'key)
返回的 JsValue
是否未定义?
这很有趣。 commit 表示 "JsUndefined should not be a JsValue"。这很公平,我认为使用 Some/None 方法更有意义。
如果你想完全按照你写的那样做,可以使用这样的东西:
val v: Seq[JsValue] = (json \ "key").toOption.map {
case JsArray(els) => els
case _ => Seq[JsValue]()
} getOrElse(Seq[JsValue]())