将未来结果转换为 json



我有两个沟通模型:

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 中保存类型以供将来使用的最佳方法是什么?

OkResponsemodel值的类型未知,因此您得到底部类型 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)) 
}

最新更新