从序列构造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 }

我试图使用库生成一些json,该库使用基于嵌套元组结构的dsl构建json。我有一个scala
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,这正是我想要的,比我担心的要简单得多。