如何为混合类型的嵌套列表指定salat DAO模型?
问题描述:
我有数据来从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
显然,数据可以存储在一个更好的形式,用一个对象而不是长度为二的数组。但鉴于这是我的,有没有一种使用萨拉特进行反序列化的好方法?谢谢!
答
萨拉特项目在这里领先。不管你的数据结构如何,你都需要为列表指定一个类型。 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项目将您的数据反序列化。
非常感谢解释和替代品的指针。我同意数组成员可以更好地表示为对象而不是数组。 – mrjf 2013-02-14 18:03:58