我有两个沟通模型:
case class Post(id: Int, name: String, text: String)
case class Tag(id: Int, name: String)
我为此模型创建了 json 格式:
import play.api.libs.json._
object myFormats {
implicit val postFormat = Json.format[Post]
implicit val tagFormat = Json.format[Tag]
}
然后我创建可以返回 OkResponse 或 BadResponse 的服务(actor)
sealed trait Response
case class OkResponse[T](model: T) extends Response
case class BadResponse(msg: String) extends Response
// easy example
case class Message(id: Int)
class MyActorService extends Actor {
def receive = {
case Message(id) =>
if (id == 0) {
sender ! OkResponse(Post(1, "foo", "bar"))
} else if (id == 1) {
sender ! OkResponse(Tag(1, "tag"))
} else {
sender ! BadResponse("id overflow")
}
}
}
然后我想将模型 OkResponse 转换为 Json 值:
(myActorService ? Message(1)).mapTo[Response].map {
case BadResponse(msg) => println(msg)
case OkResponse(model) =>
println(Json.toJson(model))
}
但这没有编译,因为No Json serializer found for type Any. Try to implement an implicit Writes or Format for this type.
如何谈论我的模型类型?在 scala 中保存类型以供将来使用的最佳方法是什么?
OkResponse
中model
值的类型未知,因此您得到底部类型 Any
。
您可以在OkResponse
的型号上进行模式匹配。
(myActorService ? Message(1)).mapTo[Response].map {
case BadResponse(msg) => println(msg)
case OkResponse(post: Post) =>
println(Json.toJson(post))
case OkResponse(tag: Tag) =>
println(Json.toJson(tag))
}