我有从MongoDB返回的数据,如下所示:
> db.foo.findOne()
[
{
"_id" : "some string",
"bar" : [
[
14960265,
0.5454545454545454
],
[
30680,
0.36363636363636365
],
[
12852625,
0.09090909090909091
]
],
}
]
bar
属性包含未知大小的列表,其中每个项目都是包含Int和Double的长度为2的列表。在Scala中,我将其表示为List [(Int,Double)]。
我如何编写此结构的模型以与Salat一起使用?
Salat没有做元组,所以我尝试了:
case class FooEntry(a: Int, b: Double)
case class Foo(_id: String, bar: List[FooEntry])
但得到了:
java.lang.IllegalArgumentException:BasicBSONList只能使用 数字键,而不是:[a]
也尝试过:
case class Foo(_id: String, sps: List[Any])
但得到了:
java.lang.ClassCastException:com.mongodb.BasicDBList无法强制转换 到scala.collection.immutable.List
显然,数据可以以更好的形式存储,使用对象而不是长度为2的数组。但鉴于这就是我所拥有的,是否有一种很好的方法可以使用Salat对其进行反序列化?谢谢!
答案 0 :(得分:3)
Salat项目在这里领先。无论您的数据结构是什么,您都需要为列表指定类型。 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])
或者,考虑尝试使用Miles Sabin的Shapeless项目或Alois Cochard的Sherpa项目来反序列化您的数据。