0

我从 MongoDB 返回的数据如下所示:

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

bar属性包含一个未知大小的列表,其中每个项目都是一个长度为 2 的列表,其中包含一个 Int 和一个 Double。在 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 反序列化它的好方法?谢谢!

4

1 回答 1

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 项目来反序列化您的数据。

于 2013-02-14T13:57:52.483 回答