Как указать модель DAO salat для вложенного списка смешанного типа?

У меня есть данные, возвращаемые из MongoDB, которые выглядят так:

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

bar Свойство содержит список неизвестного размера, каждый элемент которого является списком длины два, содержащим Int и Double. В Scala я бы представлял это как List[(Int, Double)].

Как бы я написал модель для этой структуры для использования с 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

Очевидно, что данные могут быть сохранены в лучшем виде с объектом вместо массивов длины два. Но учитывая, что это то, что у меня есть, есть ли хороший способ использовать Salat для его десериализации? Спасибо!

1 ответ

Решение

Проект 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])

Кроме того, рассмотрите возможность использования проекта Майлза Сабина Shapeless или проекта Slopa Алоиса Кочарда для десериализации ваших данных.

Другие вопросы по тегам