来自Map的案例类

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


为特定案例分类做这件事很简单:

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)
链接地址: http://www.djcxy.com/p/11703.html

上一篇: case class from Map

下一篇: How to ensure annotations execution order in java?