如何使用 Play Json 为泛型定义隐式反序列化器

How to define an implicit deserializer using Play Json for generic types

我有一个接受 T 的方法,我想做 Json.parse(someString).as[T]

现在我传入的 T 类 定义了隐式格式,例如 implicit lazy val format: Format[Foo] = ...。但是,我希望能够告诉编译器在运行时找到隐式格式,而不是抱怨 "No Json deserializer found for type T".

正确的做法是在 T 上添加一个 context bound:

def yourMethod[T: Reads](...) = ...

它不会在运行时寻找隐式(Scala 做不到),但如果范围内没有像 format 这样的隐式可用,它不会让您调用该方法。当存在时,它会将它传递给 as 和任何其他需要它的方法。

如果您的方法既需要序列化又需要序列化,您将需要两个边界:T: Reads: Writes 或只需要 T: Format.