来自Map的案例类

时间:2013-01-13 15:15:19

标签: scala maps case-class

我正在尝试从Scala案例类到Maps(field_name - > field_value)实现(de)序列化。问题是我不知道如何创建一个函数,它将采用case类类型和map,实例化,填充并返回它。我已经在一些JSON库中看到过这种情况,但我没有得到代码。

1 个答案:

答案 0 :(得分:3)

为特定案例类执行此操作非常简单:

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class Foo(x: Int, y: Double, z: String) {
  def toMap = Map('x -> x, 'y -> y, 'z -> z)
}
object Foo {
  def apply(vals: Map[Symbol, Any]): Foo = Foo(vals('x).asInstanceOf[Int], vals('y).asInstanceOf[Double], vals('z).asInstanceOf[String])
}

// Exiting paste mode, now interpreting.

defined class Foo
defined module Foo

scala> Foo(Map('x -> 1, 'y -> 2.0, 'z -> "wibble"))
res0: Foo = Foo(1,2.0,wibble)

scala> res0.toMap
res1: scala.collection.immutable.Map[Symbol,Any] = Map('x -> 1, 'y -> 2.0, 'z -> wibble)

但我猜你想要创建适用于任何案例类的东西,你不一定知道这些值的名称是什么?

在这种情况下,你将不得不看一下反射(在Scala 2.10.0中添加):

http://docs.scala-lang.org/overviews/reflection/overview.html

您可以使用反射来迭代类的成员,找出他们的名字然后创建您的地图。例如:

scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> typeOf[Foo].members filter { m => m.isMethod && m.asMethod.isStable }
res2: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(value z, value y, value x)