如何在特征中定义隐式写入
How to define implicit Writes in trait
我有多个案例 classes 代表数据库中的值 for ex User 保存基于用户的属性,如姓名/年龄/地址和 CallLog 保存时间戳/status_of_call
我想要达到的目标
我想要一个辅助函数,它接受模型列表并检查列表是否为空然后 returns "error" 否则应该 return json 数组名单。
我的方法
我想要一个将某些模型分组到其中的特征,辅助方法将接受特征或它的列表以便检查,或者可能有一个实现该特征的泛型。
问题
由于隐式写入与模型 class 紧密耦合,编译器在行 Json.toJson(list)
上抛出错误
我尝试过的东西
隐含在 trait 中并得到递归类型错误
我是 scala noob 如果这听起来很傻,请原谅我
提前致谢
由于 User、CallLog 等将以不同方式序列化,每个 Writes[T] 对于模型特征的每个实现都将不同,因此 Writes[Model] 必须知道它试图序列化的实现.
因此不可能将它作为模型特征的一部分,因为当您定义它时,此信息还未知。
您的解决方法是在辅助函数的范围内定义 Writes[Model]。
您的辅助函数的实现可能是这样的:
import play.api.libs.json.{JsValue, Json, Writes}
sealed trait Model
case class User(name: String, age: String, address: String) extends Model
object User {
implicit val userWrites = Json.writes[User]
}
case class CallLog(timestamp: String, status_of_call: String) extends Model
object CallLog {
implicit val callLogWrites = Json.writes[CallLog]
}
implicit val modelWrites = new Writes[Model] {
override def writes(o: Model): JsValue = o match {
case u: User => Json.toJson(u)
case cl: CallLog => Json.toJson(cl)
}
}
def helper(models: Model*): Either[JsValue, String] = models match {
case Nil => Right("Error")
case _ => Left(Json.toJson(models))
}
helper(User("John", "32", "..."))
helper(User("John", "32", "..."), CallLog("now", "In progress"))
我有多个案例 classes 代表数据库中的值 for ex User 保存基于用户的属性,如姓名/年龄/地址和 CallLog 保存时间戳/status_of_call
我想要达到的目标
我想要一个辅助函数,它接受模型列表并检查列表是否为空然后 returns "error" 否则应该 return json 数组名单。
我的方法
我想要一个将某些模型分组到其中的特征,辅助方法将接受特征或它的列表以便检查,或者可能有一个实现该特征的泛型。
问题
由于隐式写入与模型 class 紧密耦合,编译器在行 Json.toJson(list)
我尝试过的东西 隐含在 trait 中并得到递归类型错误
我是 scala noob 如果这听起来很傻,请原谅我 提前致谢
由于 User、CallLog 等将以不同方式序列化,每个 Writes[T] 对于模型特征的每个实现都将不同,因此 Writes[Model] 必须知道它试图序列化的实现.
因此不可能将它作为模型特征的一部分,因为当您定义它时,此信息还未知。
您的解决方法是在辅助函数的范围内定义 Writes[Model]。
您的辅助函数的实现可能是这样的:
import play.api.libs.json.{JsValue, Json, Writes}
sealed trait Model
case class User(name: String, age: String, address: String) extends Model
object User {
implicit val userWrites = Json.writes[User]
}
case class CallLog(timestamp: String, status_of_call: String) extends Model
object CallLog {
implicit val callLogWrites = Json.writes[CallLog]
}
implicit val modelWrites = new Writes[Model] {
override def writes(o: Model): JsValue = o match {
case u: User => Json.toJson(u)
case cl: CallLog => Json.toJson(cl)
}
}
def helper(models: Model*): Either[JsValue, String] = models match {
case Nil => Right("Error")
case _ => Left(Json.toJson(models))
}
helper(User("John", "32", "..."))
helper(User("John", "32", "..."), CallLog("now", "In progress"))