如何使用scala中的playframework将json反序列化为密封特征?

时间:2015-04-29 13:50:47

标签: json scala playframework

我是scala的新手并且陷入了对象反序列化。我感谢任何帮助。

所以问题是,我有sealed trait Permission和一些扩展它的案例对象:

sealed trait Permission
case object Administrator extends Permission
case object Dispatcher extends Permission
case object Editor extends Permission
case object NormalUser extends Permission
object Permission {

  def valueOf(value: String): Permission = value match {
    case "Administrator"  => Administrator
    case "Dispatcher"     => Dispatcher
    case "Editor"         => Editor
    case "NormalUser"     => NormalUser
    case _                => throw new IllegalArgumentException()
  }

  def stringValueOf(value: Permission): String = value match {
    case Administrator  => "Administrator"
    case Dispatcher     => "Dispatcher"
    case Editor         => "Editor"
    case NormalUser     => "NormalUser"
    case _              => throw new IllegalArgumentException()
  }

}

我有User案例类Permission

case class User(id: Option[Int],
                username: String,
                permission: Permission,
                firstName: Option[String]=None,
                lastName: Option[String]=None)

我已经创建了Json.reads[Permission]Json.reads[User],但每当我运行代码时,我都会遇到No unapply function found异常。我试图寻找同样的问题,但没有得到任何结果。请帮忙解决这个问题。 THX。

使用scala 2.11.x和PlayFramework

2 个答案:

答案 0 :(得分:0)

经过一番研究和尝试,我找到了这个解决方案: implicit val permissionReads = (__).read[String].map{ permission => Permission.valueOf(permission)}

答案 1 :(得分:0)

我在聚会上有点迟到了,但看起来您正在使用已经有case object方法的toString s,它会返回对象的名称,所以伴随方法中的stringValueOf可能是还原剂。

此外,如果您不想再维护该子类对象列表,您可能需要在此处查看我的库https://github.com/lloydmeta/enumeratum,特别是JSON序列化程序和解串器附带的enumeratum-play项目内置。