2013-02-14 6 views
0

У меня есть данные, возвращаясь из MongoDB, который выглядит следующим образом:Как указать модель DAO для вложенного списка смешанного типа?

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

Свойство bar содержит список неизвестного размера, каждый элемент которого представляет собой список длины два содержащих 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 может работать только с цифровыми клавишами, а не: [а ]

попытался также:

case class Foo(_id: String, sps: List[Any]) 

но получили:

java.lang.ClassCastException: com.mongodb.BasicDBList не может быть брошен к scala.collection.immutable.List

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

ответ

3

Проект 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 Сабины или Алоис Кошар-х Проект Sherpa для десериализации ваших данных.

+0

Большое спасибо за объяснение и указатели на альтернативы. Я согласен, что члены массива будут лучше представлены как объекты, чем массивы. – mrjf