我需要向使用Play框架从JSON构建的案例类添加静态值。我可以这样添加一个常量值:
implicit val userRead: Reads[UserInfo] = (
Reads.pure(-1L) and
(JsPath \ "firstName").readNullable[String] and
(JsPath \ "lastName").readNullable[String]
)(UserInfo.apply _)
但是我看不到如何在调用变量时将变量传递给隐式Reads。我是Scala的新手,所以可能缺少明显的东西吗?
答案 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