私はJsonをケースクラスまたはenumにマップするためにplay-jsonを使用しています。私はFormats
を暗黙的に作成するスマートな方法を探しています。私のプロジェクトには多くの型定義が含まれているからです。play-jsonを使用して暗黙的にcaseクラスのシリアライザとデシリアライザを生成する
は、現時点では私は列挙型のためFormats
を生成するための簡単な関数を作成:
def formatEnum[E <: Enumeration](enum: E) = Format(Reads.enumNameReads(enum), Writes.enumNameWrites)
をしかし、それは暗黙のコンバータとして使用することはできませんので、それは非暗黙の引数を取ります。
私はケースクラスのために同じことを実行しようとしました:
implicit def caseFormat[A] = Json.format[A]
しかしJson.format
は、クラスの構造を調べるマクロですので、私は、エラー「が見つかりません適用を解除するか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)
}
しかし、値を生成する必要があります暗黙のDEFがありますが、コンパイラは、暗黙のFormat
を見つけることができません:
は、その後、私はこのように私のマクロを作成しようとしました。
私は単純に多くの暗黙のvalを定義することができますが、私はそれを行うよりスマートな方法があると思います。
:
あなたは、としてこれを使用することができますか? – phantomastray