Я использую play-json для сопоставления классов Jones с именами и перечислениями. Я ищу умный способ создания Formats
неявно, так как мой проект содержит множество определений типов.Производить сериализатор классов классов и десериализатор неявно с помощью play-json
На данный момент я создал простую функцию для генерации Formats
для Перечисления:
def formatEnum[E <: Enumeration](enum: E) = Format(Reads.enumNameReads(enum), Writes.enumNameWrites)
Но он принимает без неявного аргумента, поэтому он не может быть использован в качестве неявного преобразователя.
Я попытался сделать то же самое для случая классов:
implicit def caseFormat[A] = Json.format[A]
Но я получаю сообщение об ошибке «Нет исключить его или 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
, хотя существует неявное четкости, который должен генерировать значение.
Конечно, я могу просто определить многие неявные значения val, но я думаю, что есть более умный способ сделать это.
вы можете принять ответ, если это помогает? – phantomastray