Я пытаюсь решить этот вопрос, используя Shapeless, вкратце о преобразовании вложенного класса case в 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)
}
Я пытаюсь иметь рекурсивный писатель, чтобы проверить каждое значение и попытаться сделать карту для каждого элемента в значении. Вышеприведенный код работает нормально, но когда я хочу перебрать 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.