(播放2.5)如何为选项的类型别名定义json格式?

时间:2016-03-02 07:45:14

标签: json scala playframework type-alias

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.

的编译错误

如何定义JSON格式?

1 个答案:

答案 0 :(得分:3)

此错误来自play.api.libs.json.JsMacroImpl.scala (line 164 in Play 2.5.0-RC2)中的自动隐式生成宏。

此代码在分析之前没有处理类型,因此它甚至无法推断TypeA.myTypeAliasOption

您可以做的一件事是指定隐式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

我相信,当使用类型别名和使用{{1}自动隐式生成时,不可能实现将缺失路径解释为None的行为,并跳过序列化None }。如果您想要这种行为,则必须手动编写JSON Json.format