如何从隐式请求的JSON解析有界类型T的对象?

如何从隐式请求的JSON解析有界类型T的对象?,json,scala,serialization,play-json,Json,Scala,Serialization,Play Json,我有一些简单的消息,其中隐式的Json.reads和Json.formats是在它们的伴随对象中定义的。所有这些消息都扩展了MyBaseMessage 换句话说,对于任何TJsValue,#as[A]需要隐式读取[A],以便将JSON反序列化为某种类型A。也就是说,您收到的错误消息是因为编译器不能保证任何类型的JsValue都有一个Reads[t],因为[a]需要一个隐式Reads[a],以便将JSON反序列化为某个类型a。也就是说,您收到的错误消息是由于编译器不能保证任何类型的t Hmm都有R

我有一些简单的消息,其中隐式的
Json.reads
Json.formats
是在它们的伴随对象中定义的。所有这些消息都扩展了MyBaseMessage


换句话说,对于任何
T
JsValue,#as[A]
需要隐式
读取[A]
,以便将JSON反序列化为某种类型
A
。也就是说,您收到的错误消息是因为编译器不能保证任何类型的JsValue都有一个
Reads[t]
,因为[a]
需要一个隐式
Reads[a]
,以便将JSON反序列化为某个类型
a
。也就是说,您收到的错误消息是由于编译器不能保证任何类型的
t Hmm都有
Reads[t]
导致的,您可以发布更多的代码吗?就像定义
addX
?@AndreiT的一样
addX
是上述问题中类似
addMoo
addBoo
的方法类的通用标记。
MyBaseMessage
是密封特征吗?@AndreiT。这是一个抽象类。嗯,你能发布更多的代码吗?就像定义
addX
?@AndreiT的一样
addX
是上述问题中类似
addMoo
addBoo
的方法类的通用标记。
MyBaseMessage
是密封特征吗?@AndreiT。这是一个抽象类。在按钮的右边——添加了
(隐式fjs:Reads[T])
作为
FooAction
的参数,它成功了。我还使用了
Action(parser.json)
(在执行同步操作时),但添加了验证优化。非常干净。整体回答很好。感谢您抽出时间帮助一个玩noob的人。:)在按钮的右边——添加了
(隐式fjs:Reads[T])
作为
FooAction
的参数,它成功了。我还使用了
Action(parser.json)
(在执行同步操作时),但添加了验证优化。非常干净。整体回答很好。感谢您抽出时间帮助一个玩noob的人。:)
// AddBooMessage extends MyBaseMessage
def addBoo = FooAction[AddBooMessage]  

// AddMooMessage extends MyBaseMessage
def addMoo = FooAction[AddMooMessage]

// etc. ...
  private def FooAction[T <: MyBaseMessage] = Action {
    implicit request =>
       parseAndForward[T](request)
  } 

  private def parseAndForward[T <: MyBaseMessage](request: Request[AnyContent]) = {
    val parsedRequest = Json.parse(request.body.toString).as[T]
    Logger.info(s"Got '$parsedRequest' request. Forwarding it to the Cluster.")
    sendToCluster(parsedRequest)
  }
private def FooAction[T <: MyBaseMessage : Reads] = Action { implicit request =>
  parseAndForward[T](request)
} 

private def parseAndForward[T <: MyBaseMessage : Reads](request: Request[AnyContent]) = {
  val parsedRequest = Json.parse(request.body.toString).as[T]
  Logger.info(s"Got '$parsedRequest' request. Forwarding it to the Cluster.")
  sendToCluster(parsedRequest) // Assuming this returns a `Future[Result]`
}
private def FooAction[T <: MyBaseMessage] = Action.async(parse.json) { implicit request =>
  parseAndForward[T](request)
} 

private def parseAndForward[T <: MyBaseMessage](request: Request[JsValue]) = {
  request.body.validate[T].fold(
    error => {
      Logger.error(s"Error parsing request: $request")
      Future.successful(BadRequest)
    },
    parsed => {
      Logger.info(s"Got '$parsed' request. Forwarding it to the Cluster.")
      sendToCluster(parsed)
    }
  )
}