2013-02-14 57 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