2014-06-21 32 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

美麗,這正是我想要的,比我想象的要簡單得多。 –