如何为混合类型的嵌套列表指定salat DAO模型?

时间:2013-02-14 09:26:35

标签: mongodb scala serialization casbah salat

我有从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对其进行反序列化?谢谢!

1 个答案:

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