2014-06-21 34 views
1

我想要生成一些使用json4s库的json,它使用基于嵌套元组结构的dsl构建json。我有我想要斯卡拉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支持递归类型,似乎可能适合账单,但在这种情况下我无法理解如何使用它们,也不知道它们对于“真实”系统是否安全。

回答

1

由于累加器必须是整个时间都是相同的类型,所以你不能用普通的旧褶皱来做到这一点。

您可以进行改造,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 
     } 
     } 
    } 
    } 
} 

(如一个脚注,有a way你可以用元组来折叠,并以适当的静态类型结束,但这在这种情况下几乎肯定不是你想要的。)

+0

美丽,这正是我想要的,比我想象的要简单得多。 –