在Implicit中添加参数Reads使用Play从JSON构建案例类

时间:2018-10-15 14:43:10

标签: json scala playframework

我需要向使用Play框架从JSON构建的案例类添加静态值。我可以这样添加一个常量值:

implicit val userRead: Reads[UserInfo] = (
  Reads.pure(-1L) and
  (JsPath \ "firstName").readNullable[String] and
  (JsPath \ "lastName").readNullable[String] 
)(UserInfo.apply _)

但是我看不到如何在调用变量时将变量传递给隐式Reads。我是Scala的新手,所以可能缺少明显的东西吗?

2 个答案:

答案 0 :(得分:1)

我假设您的UserInfo是这样的:

case class UserInfo(id: Long, firstName: Option[String], lastName: Option[String])

您只需要微调userRead

def userRead(id: Long): Reads[UserInfo] = (
  Reads.pure(id) and
  (JsPath \ "firstName").readNullable[String] and
  (JsPath \ "lastName").readNullable[String]
)(UserInfo.apply _)

然后在解码json时显式地使用它:

json.as[UserInfo](userRead(12345L))

或者,也可以实例化Reads使其成为implicit

implicit val userRead12345 = userRead(12345L)

json.as[UserInfo]

答案 1 :(得分:0)

有一个更简单的解决方案:

import play.api.libs.json._

在末尾添加所有具有静态默认值的值:

case class UserInfo(firstName:String, lastName:String, id:Long = -1)

play-json format用作默认值:

object UserInfo{

    implicit val jsonFormat: Format[UserInfo] = Json.using[Json.WithDefaultValues].format[UserInfo]
}

并像这样使用它

val json = Json.toJson(UserInfo("Steve", "Gailey"))

println(json.validate[UserInfo])

在此处查看整个example