2013-02-14 27 views
0

我有數據來從MongoDB的,看起來像這樣回:如何爲混合類型的嵌套列表指定salat DAO模型?

> db.foo.findOne() 
[ 
    { 
     "_id" : "some string", 
     "bar" : [ 
      [ 
       14960265, 
       0.5454545454545454 
      ], 
      [ 
       30680, 
       0.36363636363636365 
      ], 
      [ 
       12852625, 
       0.09090909090909091 
      ] 
     ], 
    } 
] 

bar屬性包含未知大小的列表,每個項目其中是包含一個Int和雙長度爲2的列表。在Scala中,我將把它表示爲List [(Int,Double)]。

我該如何編寫這個結構的模型來與Salat一起使用?

禮拜不做元組,所以我嘗試:

case class FooEntry(a: Int, b: Double) 
case class Foo(_id: String, bar: List[FooEntry]) 

,但得到:

java.lang.IllegalArgumentException異常:BasicBSONList只能 數字鍵,不工作:[一]

也試過:

case class Foo(_id: String, sps: List[Any]) 

,但得到:

java.lang.ClassCastException:com.mongodb.BasicDBList不能轉換 到scala.collection.immutable.List

顯然,數據可以存儲在一個更好的形式,用一個對象而不是長度爲二的數組。但鑑於這是我的,有沒有一種使用薩拉特進行反序列化的好方法?謝謝!

回答

3

薩拉特項目在這裏領先。不管你的數據結構如何,你都需要爲列表指定一個類型。 Salat尚不支持元組,而Salat支持多態集合(這需要類型提示!),但它不支持類似你的異類類型列表。

你能調整你的數據,以便陣列成員都沒有列出,而是

[ 
    {x: 123, y: 123.0}, 
    {x: 456, y: 456.0} 
] 

那麼你可以使用

case class Bar(x: Long, y: Double) 
case class Foo(_id: String, sps: List[Bar]) 

或者,考慮嘗試使用里程薩賓的無形項目或阿洛伊斯Cochard的Sherpa項目將您的數據反序列化。

+0

非常感謝解釋和替代品的指針。我同意數組成員可以更好地表示爲對象而不是數組。 – mrjf 2013-02-14 18:03:58