我正在使用 play-json 将 Json 映射到案例类或枚举。我正在寻找一种Formats
隐式创建的智能方法,因为我的项目包含许多类型定义。
目前我创建了一个简单的函数来Formats
为枚举生成:
def formatEnum[E <: Enumeration](enum: E) = Format(Reads.enumNameReads(enum), Writes.enumNameWrites)
但它需要一个非隐式参数,因此它不能用作隐式转换器。
我尝试对案例类做同样的事情:
implicit def caseFormat[A] = Json.format[A]
但是我收到错误“没有找到 unapply 或 unapplySeq 函数”,因为Json.format
它是一个检查类结构的宏。
然后我尝试以这种方式创建我的宏:
import scala.language.experimental.macros
import scala.reflect.macros.whitebox.Context
implicit def caseFormat[A](): Format[A] = macro impl[A]
def impl[A: c.WeakTypeTag](c: Context)(): c.Expr[Reads[A]] = {
import c.universe._
val TypeRef(pre, sym, args) = weakTypeTag[A].tpe
val t = args.head
val expr = q"Json.format[$t]"
c.Expr[Reads[A]](expr)
}
但是编译器没有找到隐含的Format
,尽管有一个隐含的 def 应该生成该值。
当然我可以简单地定义很多隐含的 val,但我认为有一个更聪明的方法来做到这一点。