当前位置: 首页 > 知识库问答 >
问题:

在Scala中将嵌套Case类转换为嵌套映射

戚育
2023-03-14

我有两个嵌套的case类:

case class InnerClass(param1: String, param2: String)
case class OuterClass(myInt: Int, myInner: InnerClass)
val x = OuterClass(11, InnerClass("hello", "world"))
Map(myInt -> 11, myInner -> Map(param1 -> hello, param2 -> world))

当然,解决方案应该是泛型的,并且适用于任何case类。

注意:这个讨论很好地回答了如何将单个case类映射到映射。但我无法将其用于嵌套的case类。相反,我得到了:

Map(myInt -> 11, myInner -> InnerClass(hello,world)

共有1个答案

澹台胜
2023-03-14

正如Luigi Plinge在上面的评论中所指出的,这是一个非常糟糕的主意--您将类型安全抛到了窗外,并且将会遇到大量难看的转换和运行时错误。

也就是说,使用新的Scala2.10反射API执行您想要的操作非常容易:

def anyToMap[A: scala.reflect.runtime.universe.TypeTag](a: A) = {
  import scala.reflect.runtime.universe._

  val mirror = runtimeMirror(a.getClass.getClassLoader)

  def a2m(x: Any, t: Type): Any = {
    val xm = mirror reflect x

    val members = t.declarations.collect {
      case acc: MethodSymbol if acc.isCaseAccessor =>
        acc.name.decoded -> a2m((xm reflectMethod acc)(), acc.typeSignature)
    }.toMap

    if (members.isEmpty) x else members
  }

  a2m(a, typeOf[A])
}

后来呢:

scala> println(anyToMap(x))
Map(myInt -> 11, myInner -> Map(param1 -> hello, param2 -> world))
 类似资料:
  • 我需要在代码的几个地方将这个映射转换为我的case类,如下所示: 最简单的方法是什么?我能用隐式吗?

  • 我遇到了一个问题,我的程序只在的一次迭代中结束,我不确定不合逻辑的代码在哪里。 全球给予: 我复杂的嵌套从这里开始,但我不确定如何修复它,以便它迭代通过和数字for-循环: 我得到以下输出: 我从来没有得到Susie的数据,我很早就回来了,但似乎不知道在哪里。对于问题所在(甚至重构)的任何帮助/指导都将不胜感激。提前谢谢!

  • 问题内容: 我在Scala和Java之间遇到编译问题。 我的Java代码需要一个 我的scala代码有一个 我收到编译错误: 似乎scala.collection.JavaConversions不适用于嵌套集合,即使Vector可以隐式转换为Iterable。除了遍历scala集合并手动进行转换之外,我还能做些什么使这些类型起作用? 问题答案: 应该弃用恕我直言。您最好使用来明确说明转换的时间和地

  • 我对反思并不是很高兴,这个答案使用无形状代码在某些情况下(但似乎有许多边缘情况)可以使用无形状代码将MAP[String,Any]转换为case类,不能处理可选的子结构

  • 问题内容: 表格1: 表2: 我只需要在值TABLE1。“ SALE_SUM_PIECES”小于TABLE2中“ PIECES”的总和时减去on的值。例如:的值就是。现在,我需要检查SUM的值在哪一行。在下面的示例中,TABLE2中的第一行无效,因为7大于6。但是TABLE2中的第二行是有效的,因为row1中“块”的总和并且TABLE2中的row2即6 + 10 = 16大于7。因此,我需要从第二

  • 问题内容: 我是Python和Pandas的新手。我正在尝试将Pandas Dataframe转换为嵌套的JSON。函数.to_json()不能为我的目标提供足够的灵活性。 以下是数据框的一些数据点(在csv中,以逗号分隔): 有很多重复的信息,我想要一个这样的JSON: 我怎样才能做到这一点? 编辑: 再现数据帧的代码: 问题答案: 更新: 结果(格式化): 旧答案: 你可以用它做的,和方法: