如果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()))))) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |