如何从隐式请求的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
换句话说,对于任何
TJsValue,#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)
}
)
}