从序列构造Scala动态元组类型
我试图使用库生成一些json,该库使用基于嵌套元组结构的dsl构建json。我有一个scala从序列构造Scala动态元组类型,scala,types,Scala,Types,我试图使用库生成一些json,该库使用基于嵌套元组结构的dsl构建json。我有一个scalaSeq,我希望能够将其转换为元组嵌套,如下所示: // scala Seq val s = Seq("a", "b", "c", "d") val rootItem = "id" -> 1234 // desired json { "a" : { "b" : { "c" : { "d" : { "id" : 1234 }
Seq
,我希望能够将其转换为元组嵌套,如下所示:
// scala Seq
val s = Seq("a", "b", "c", "d")
val rootItem = "id" -> 1234
// desired json
{
"a" : {
"b" : {
"c" : {
"d" : {
"id" : 1234
}
}
}
}
}
如果我强制它忽略类型,我可以生成所需的元组结构,如下所示:
// yields ("a", ("b", ("c", ("d", ("id", 1234)))))
s.foldRight[Any](rootItem)(_ -> _)
但是,由于结果的类型现在表示为
Any
,因此将其写入json的隐式转换不会触发(并在显式调用时引发异常),尽管实际类型是正确的。我不知道如何以类型安全的方式构造这个数据结构。理想情况下,我希望有一个能够适当构建类型的解决方案,尽管我知道这可能是不可能的,因为它只需要运行时可用的信息(列表的长度)。我知道scala支持递归类型,这似乎很合适,但我不知道在这种情况下如何使用它们,也不知道它们对于“真实”系统是否安全。使用简单的旧折叠无法做到这一点,因为累加器必须始终是同一类型
但是,您可以在进行转换时将其转换为JSON:
val s = Seq("a", "b", "c", "d")
val rootItem = "id" -> 1234
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
val json = s.foldRight[JObject](rootItem)(_ -> _)
然后您可以执行以下操作,因为json
是静态类型的JObject
:
scala> pretty(render(json))
res0: String =
{
"a" : {
"b" : {
"c" : {
"d" : {
"id" : 1234
}
}
}
}
}
(作为一个脚注,您可以使用元组进行折叠,并最终得到适当的静态类型,但这几乎肯定不是您在本例中想要的。)Beauty,这正是我想要的,比我担心的要简单得多。