我是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
答案 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
项目内置。