2016-03-02 4 views
2
case class ClassA(myObjectType: TypeA.myTypeAlias) 

object ClassA { 

    implicit def jsonFormat: Format[ClassA] = Json.format[ClassA] 

} 

object TypeA { 

    type myTypeAlias = Option[String] 
} 

Я получаю ошибку компиляции из No implicit format for typeA.myObjectType available.(Воспроизведение 2.5) Как вы определяете формат json для псевдонима типа опции?

Как вы определяете формат JSON?

+0

Где вы на самом деле получаете ошибку компилятора? – Ryan

ответ

3

Эта ошибка исходит из автоматического неявного макроса генерации в play.api.libs.json.JsMacroImpl.scala (line 164 in Play 2.5.0-RC2).

Этот код не является разновидностью типов, прежде чем анализировать их, поэтому он не может сделать вывод, что TypeA.myTypeAlias является Option.

Одна вещь, которую вы можете сделать, это указать неявный Format[myTypeAlias]:

object ClassA { 
    implicit val myTypeAliasFormat: Format[TypeA.myTypeAlias] = Format.optionWithNull 
    implicit def jsonFormat: Format[ClassA] = Json.format[ClassA] 
} 

или

object TypeA { 
    type myTypeAlias = Option[String] 
    implicit val myTypeAliasFormat: Format[myTypeAlias] = Format.optionWithNull 
} 

object ClassA { 
    import TypeA.myTypeAliasFormat 
    implicit def jsonFormat: Format[ClassA] = Json.format[ClassA] 
} 

Обратите внимание, что она будет преобразовывать JSON null в None, выход ошибка, если путь отсутствует, и сериализовать None как JSON null.

Я считаю, что невозможно использовать поведение для интерпретации недостающих путей как None и пропускать сериализацию None при использовании псевдонимов типов и автоматической неявной генерации с Json.format. Вам нужно будет вручную написать JSON Format, если вы хотите этого поведения.

+0

Спасибо человеку за помощь. – Max

Смежные вопросы