我正在尝试使用Shapeless解决[这个][1]问题,总的来说就是将嵌套的case class转换为Map[String,Any],以下是示例:
case class Person(name:String, address:Address)
case class Address(street:String, zip:Int)
val p = Person("Tom", Address("Jefferson st", 10000))
目标是将
p
转换为以下内容:Map("name" -> "Tom", "address" -> Map("street" -> "Jefferson st", "zip" -> 10000))
我正在尝试使用Shapeless的LabelledGeneric
来实现,以下是我的进展:
import shapeless._
import record._, syntax.singleton._
import ops.record._
import shapeless.ops.record._
def writer[T,A<:HList,H<:HList](t:T)
(implicit lGeneric:LabelledGeneric.Aux[T,A],
kys:Keys.Aux[A,H],
vls:Values[A]) = {
val tGen = lGeneric.to(t)
val keys = Keys[lGeneric.Repr].apply
val values = Values[lGeneric.Repr].apply(tGen)
println(keys)
println(values)
}
我正在尝试让一个递归的写入器检查每个值并尝试为值中的每个元素创建Map。上述代码工作正常,但当我想要使用以下代码迭代values
与样本Poly时,出现了以下错误。
values.map(identity)
//or
tGen.map(identity)
Error:(75, 19) could not find implicit value for parameter mapper: shapeless.ops.hlist.FlatMapper[shapeless.poly.identity.type,vls.Out]
values.flatMap(identity)
^
Error:(75, 19) not enough arguments for method flatMap: (implicit mapper: shapeless.ops.hlist.FlatMapper[shapeless.poly.identity.type,vls.Out])mapper.Out.
Unspecified value parameter mapper.
values.flatMap(identity)
^
我不知道为什么会出现那个错误。如果有更简单的方法可以使用Shapeless完成整个过程,我也很乐意了解。 [1]: Scala宏用于嵌套case类到Map和其他方式的转换
ToMapRec
来表示A
的通用表示,而不是A
本身。可能值得提出一个新问题,以避免进一步拉长评论。 - Travis BrownToMapRec[FieldType[K, V] :: T]
,你可以有一个方法返回ToMapRec[FieldType[K, List[V]] :: T]
等等。可能值得提一个新的问题。 - Travis Brown