加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如果Play / Scala JSON解析中的语句?

发布时间:2020-12-16 18:53:14 所属栏目:安全 来源:网络整理
导读:有没有办法在使用 Scala / Play解析json时执行条件逻辑? 例如,我想做类似以下的事情: implicit val playlistItemInfo: Reads[PlaylistItemInfo] = ( (if(( (JsPath "type1").readNullable[String]) != null){ (JsPath "type1" "id").read[String]} e
有没有办法在使用 Scala / Play解析json时执行条件逻辑?

例如,我想做类似以下的事情:

implicit val playlistItemInfo: Reads[PlaylistItemInfo] = (
    (if(( (JsPath  "type1").readNullable[String]) != null){ (JsPath  "type1"  "id").read[String]} else {(JsPath  "type2"  "id").read[String]}) and
      (JsPath  "name").readNullable[String]
    )(PlaylistItemInfo.apply _)

在我假设的JSON解析示例中,有两种可能的方法来解析JSON.如果项目是“type1”,那么JSON中的“type1”将有一个值.如果这在JSON中不存在或者其值为null / empty,那么我想要读取JSON节点“type2”.

上面的示例不起作用,但它让您了解我想要做的事情.

这可能吗?

解决方法

使用JSON组合器执行此操作的正确方法是使用orElse.组合器的每个部分必须是Reads [YourType],因此如果/ else不能正常工作,因为你的if子句没有返回布尔值,它将返回Reads [PlaylistItemInfo]对null检查,这将始终为true. orElse让我们组合一个查找type1字段的Read,另一个查找type2字段作为后备.

这可能不符合您的确切结构,但这里的想法是:

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class PlaylistItemInfo(id: Option[String],tpe: String)

object PlaylistItemInfo {
    implicit val reads: Reads[PlaylistItemInfo] = (
        (__  "id").readNullable[String] and
        (__  "type1").read[String].orElse((__  "type2").read[String])
    )(PlaylistItemInfo.apply _)
}

// Read type 1 over type 2
val js = Json.parse("""{"id": "test","type1": "111","type2": "2222"}""")

scala> js.validate[PlaylistItemInfo]
res1: play.api.libs.json.JsResult[PlaylistItemInfo] = JsSuccess(PlaylistItemInfo(Some(test),111),)

// Read type 2 when type 1 is unavailable
val js = Json.parse("""{"id": "test","type2": "22222"}""")

scala> js.validate[PlaylistItemInfo]
res2: play.api.libs.json.JsResult[PlaylistItemInfo] = JsSuccess(PlaylistItemInfo(Some(test),22222),)

// Error from neither
val js = Json.parse("""{"id": "test","type100": "fake"}""")

scala> js.validate[PlaylistItemInfo]
res3: play.api.libs.json.JsResult[PlaylistItemInfo] = JsError(List((/type2,List(ValidationError(error.path.missing,WrappedArray())))))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读