7

我正在尝试实现从 Scala 案例类到 Maps(field_name -> field_value)的(反)序列化。问题是我不知道如何创建一个函数,它需要一个案例类类型和一个映射,实例化、填充并返回它。我已经在一些 JSON 库中看到了这一点,但我没有得到代码。

4

1 回答 1

4

为特定的案例类执行此操作很简单:

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)
于 2013-01-13T15:28:30.757 回答