相关疑难解决方法(0)

要在Scala中映射的案例类

有没有一种很好的方法可以转换Scala case class实例,例如

case class MyClass(param1: String, param2: String)
val x = MyClass("hello", "world")
Run Code Online (Sandbox Code Playgroud)

进入某种映射,例如

getCCParams(x) returns "param1" -> "hello", "param2" -> "world"
Run Code Online (Sandbox Code Playgroud)

适用于任何案例类,而不仅仅是预定义的类.我发现你可以通过编写一个询问底层Product类的方法来拉出case类名,例如

def getCCName(caseobj: Product) = caseobj.productPrefix 
getCCName(x) returns "MyClass"
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找类似的解决方案,但对于案例类字段.我想象一个解决方案可能不得不使用Java反射,但是如果案例类的底层实现发生变化,我讨厌在未来的Scala版本中编写一些内容.

目前我正在使用Scala服务器并使用案例类定义协议及其所有消息和异常,因为它们是如此美观,简洁的构造.但是,我需要将它们转换为Java映射,以通过消息传递层发送以供任何客户端实现使用.我当前的实现只是分别为每个案例类定义一个翻译,但是找到一个通用的解决方案会很好.

scala case-class

71
推荐指数
6
解决办法
4万
查看次数

尝试使用Shapeless递归地将case类转换为异类列表的奇怪行为

我昨晚熬夜试图弄清楚这个无形的问题,如果我不把它从胸前拿走,我担心它会吃掉我的晚上,所以这里就是这样.

在这个最小化版本中,我只是定义了一个类型类,它将递归转换为异构列表:

import shapeless._

trait DeepHLister[R <: HList] extends DepFn1[R] { type Out <: HList }

trait LowPriorityDeepHLister {
  type Aux[R <: HList, Out0 <: HList] = DeepHLister[R] { type Out = Out0 }

  implicit def headNotCaseClassDeepHLister[H, T <: HList](implicit
    dht: DeepHLister[T]
  ): Aux[H :: T, H :: dht.Out] = new DeepHLister[H :: T] {
    type Out = H :: dht.Out
    def apply(r: H :: T) = r.head :: dht(r.tail)
  }
}

object DeepHLister extends LowPriorityDeepHLister {
  implicit …
Run Code Online (Sandbox Code Playgroud)

scala shapeless scala-macros

21
推荐指数
2
解决办法
1208
查看次数

使用Shapeless将Map [String,Any]转换为案例类

这里的问题是关于将案例类映射到Map [String,Any].我想知道相反的方法是什么,将Map [String,Any]转换为case类.给出以下地图:

val mp = Map("name" -> "Tom", "address" -> Map("street" -> "Jefferson st", "zip" -> 10000))
Run Code Online (Sandbox Code Playgroud)

将其转换为以下案例类Person:

case class Person(name:String, address:Address)
case class Address(street:String, zip:Int)

val p = Person("Tom", Address("Jefferson st", 10000))
Run Code Online (Sandbox Code Playgroud)

用这样的东西:

val newP = mp.asCC[Person]
assert(newP.get == p)
Run Code Online (Sandbox Code Playgroud)

我应该如何使用Shapeless.

scala shapeless

18
推荐指数
1
解决办法
2777
查看次数

将Seq,List,Option和Map等Container类型添加到无形泛型转换中

为了完成我在12中有关转换case class为/从转换的一系列问题,我想知道如何将上述答案扩展到容器类型,特别是:Map[String, Any]

  • Option
  • Seq
  • Set
  • Map
  • Tuple小号

在案例类fromto Map[String, Any]

scala shapeless

6
推荐指数
0
解决办法
189
查看次数

如何使用uPickle将case类序列化/反序列化为js.Dynamic

我使用uPickle/ScalaJS使用此代码片段将js.Dynamic对象反序列化为case类:

read[myClass](JSON.stringify(dynObj))
Run Code Online (Sandbox Code Playgroud)

其中myClass是case类,dynObj是js.Dynamic对象.

有没有样板,更简单的方法吗?

为了序列化一个case类,我已经能够使用这个例子作为起点,使用Shapeless序列化为js.Dynamic:

使用Shapeless将嵌套的case类转换为嵌套的Maps

我希望能够使用uPickle代替这一点.如何用uPickle完成往返旅行?

scala scala.js upickle

5
推荐指数
1
解决办法
768
查看次数

标签 统计

scala ×5

shapeless ×3

case-class ×1

scala-macros ×1

scala.js ×1

upickle ×1