如何为JSON编组创建通用的隐式转换

时间:2018-08-19 01:49:29

标签: scala types marshalling

我想将案例类的构造限制为某些类型,然后能够来回地整理数据。

例如,假设我有一个“ home”案例类,它带有一个“ kind”参数。我想将“种类”参数限制为已批准住房类型的列表,例如公寓,公寓等。

object Home {
  // this will create an implicit conversion to json object
  implicit lazy val jsFormat = Jsonx.formatCaseClass[Home]
}

case class Home(owner: String, kind: HousingType)

我现在需要的是一种整理HousingType的各种子类型的方法。例如,以下是一些关系:

trait HousingType

case object Apartment extends HousingType

case object Condo extends HousingType

可以预见的是,在不指定隐式转换的情况下尝试使用此命令会产生以下错误:

"could not find implicit value for parameter helper: ... HousingType"

有没有办法为此创建通用的隐式转换?

1 个答案:

答案 0 :(得分:2)

您必须指定JSON编组器必须如何转换case object,就像您拥有case class一样,JSON marshaller遵循默认行为非常简单-从case class及其类型。

您需要指示如何直接编组/解编case object,例如通过隐式转换。

  implicit object HousingTypeMarshaller extends Writes[HousingType] {
    def writes(housingType: HousingType) = housingType match {
      case Apartment => Json.toJson("Apartment")
      case Condo => Json.toJson("Condo")
    }
  }

p.s。在此示例中,我使用常规的play.json,因为我没有发现使用Jsonx的任何理由,建议您在Play Json的22个字段上遇到限制,常规的Play Json适合此case object的情况。