无法为 JSON 创建隐式读取
unable to create an implicit read for JSON
我的服务器代码将收到以下内容JSON
{
"signin-info":{
"email" : "someemail",
"password": "password"
}
}
我创建了以下 2 个案例 类 来表示这个结构。
case class UserSigninInfo(
email:String,
password:String
)
case class UserSignin(
signinInfo: UserSigninInfo
)
为了阅读 JSON,我创建了以下 2 Reads
implicit val userSigninInfoReads:Reads[UserSigninInfo] = (
(JsPath \ "email").read[String] and
(JsPath \ "password").read[String]
)(UserSigninInfo.apply _)
implicit val userSigninReads:Reads[UserSignin] = (
(JsPath \ "signin-info").read[UserSigninInfo]
)(UserSignin.apply _)
但对于 userSigninReads
,我收到以下编译错误。我做错了什么?
overloaded method value read with alternatives:
[error] (t: models.UserSigninInfo)play.api.libs.json.Reads[models.UserSigninInfo] <and>
[error] (implicit r: play.api.libs.json.Reads[models.UserSigninInfo])play.api.libs.json.Reads[models.UserSigninInfo]
[error] cannot be applied to (models.UserSigninInfo => models.UserSignin)
[error] (JsPath \ "signin-info").read[UserSigninInfo]
[error] `
为您的主要对象构造读取的解决方案是:
implicit val userSigninReads : Reads[UserSignin] =
(JsPath \ "signin-info").read[UserSigninInfo].map(UserSignin(_))
这是因为它只有一个字段。
你的构造基本上是:
((JsPath \ "signin-info").read[UserSigninInfo])(UserSignin.apply _)
简直就是
(JsPath \ "signin-info").read[UserSigninInfo](UserSignin.apply _)
因为它只是增加了额外的 ()
。
read
方法确实有两种选择:
def read[T](t: T) = Reads.pure(t)
def read[T](implicit r: Reads[T]): Reads[T] = Reads.at[T](this)(r)
它需要隐式读取或显式值,但您传递的是一个函数,这就是编译器抱怨的原因。
当您将多个字段与 and
组合时,会创建不同的对象,例如FunctionalBuilder[M]#CanBuild2[A, B]
用于 2 个元素,它有 apply
构造最终 Reads
实例的方法。
因为你只有一个对象,你可以通过从你想要的路径读取 UserSigninInfo
并将结果放入 UserSignin
和 map
来创建你的 Reads
。 =24=]
我的服务器代码将收到以下内容JSON
{
"signin-info":{
"email" : "someemail",
"password": "password"
}
}
我创建了以下 2 个案例 类 来表示这个结构。
case class UserSigninInfo(
email:String,
password:String
)
case class UserSignin(
signinInfo: UserSigninInfo
)
为了阅读 JSON,我创建了以下 2 Reads
implicit val userSigninInfoReads:Reads[UserSigninInfo] = (
(JsPath \ "email").read[String] and
(JsPath \ "password").read[String]
)(UserSigninInfo.apply _)
implicit val userSigninReads:Reads[UserSignin] = (
(JsPath \ "signin-info").read[UserSigninInfo]
)(UserSignin.apply _)
但对于 userSigninReads
,我收到以下编译错误。我做错了什么?
overloaded method value read with alternatives:
[error] (t: models.UserSigninInfo)play.api.libs.json.Reads[models.UserSigninInfo] <and>
[error] (implicit r: play.api.libs.json.Reads[models.UserSigninInfo])play.api.libs.json.Reads[models.UserSigninInfo]
[error] cannot be applied to (models.UserSigninInfo => models.UserSignin)
[error] (JsPath \ "signin-info").read[UserSigninInfo]
[error] `
为您的主要对象构造读取的解决方案是:
implicit val userSigninReads : Reads[UserSignin] =
(JsPath \ "signin-info").read[UserSigninInfo].map(UserSignin(_))
这是因为它只有一个字段。
你的构造基本上是:
((JsPath \ "signin-info").read[UserSigninInfo])(UserSignin.apply _)
简直就是
(JsPath \ "signin-info").read[UserSigninInfo](UserSignin.apply _)
因为它只是增加了额外的 ()
。
read
方法确实有两种选择:
def read[T](t: T) = Reads.pure(t)
def read[T](implicit r: Reads[T]): Reads[T] = Reads.at[T](this)(r)
它需要隐式读取或显式值,但您传递的是一个函数,这就是编译器抱怨的原因。
当您将多个字段与 and
组合时,会创建不同的对象,例如FunctionalBuilder[M]#CanBuild2[A, B]
用于 2 个元素,它有 apply
构造最终 Reads
实例的方法。
因为你只有一个对象,你可以通过从你想要的路径读取 UserSigninInfo
并将结果放入 UserSignin
和 map
来创建你的 Reads
。 =24=]