play-json を使用して、Json をケース クラスまたは列挙型にマップしています。Formats
私のプロジェクトには多くの型定義が含まれているため、暗黙的に作成するスマートな方法を探しています。
現時点では、列挙型を生成する単純な関数を作成Formats
しました。
def formatEnum[E <: Enumeration](enum: E) = Format(Reads.enumNameReads(enum), Writes.enumNameWrites)
ただし、非暗黙的な引数を取るため、暗黙的なコンバーターとして使用することはできません。
ケースクラスについても同じことを試みました:
implicit def caseFormat[A] = Json.format[A]
Json.format
しかし、クラスの構造を検査するマクロであるため、「unapply または unapplySeq 関数が見つかりません」というエラーが表示されます。
次に、この方法でマクロを作成しようとしました:
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
ただし、値を生成する必要がある暗黙の定義がありますが、コンパイラは暗黙の を検出しません。
もちろん、多くの暗黙の val を単純に定義することもできますが、もっとスマートな方法があると思います。