2014-02-08 6 views
1

Моя база данных выглядитScala Salat Deserialization: как получить карту [String, Number]?

[ 
    { 
    name: "domenic", 
    records: { 
     today: 5, 
     yesterday: 1.5 
    } 
    }, 
    { 
    name: "bob", 
    records: { ... } 
    } 
] 

Когда я пытаюсь запросы, как

val result: Option[DBObject] = myCollection.findOne(
    MongoDBObject("name" -> "domenic") 
    MongoDBObject("records" -> 1), 
) 

val records = result.get.getAs[BasicDBObject]("records").get 
grater[Map[String, Number]].asObject(records) 

он терпит неудачу (во время выполнения!) С

GRATER GLITCH - unable to find or instantiate a grater using supplied path name 

REASON: Class scala.collection.immutable.Map is an interface 

Context: 'global' 
Path from pickled Scala sig: 'scala.collection.immutable.Map' 

Я думаю, что я мог бы сделать эту работу путем создания класс case, единственным полем которого является Map[String, Number], а затем получает его собственность. Это действительно необходимо?

ответ

0

grater не принимает коллекцию как аргумент типа, только класс case или класс/абстрактный класс, чьи конкретные представления являются классами case. Поскольку вы просто запрашиваете карту, просто извлеките нужные значения из DBObject, используя getAs[T].

Number не может быть поддержанным типом в Salat - я, конечно, никогда не пробовал. Если вам нужно Number, вы можете написать собственный трансформатор или отправить запрос на растяжение, чтобы добавить реальную поддержку Salat.

+0

«Номер» - это единственный способ работать с JSON в моем коротком опыте, поскольку в противном случае он генерирует исключение, когда у вас есть дробные числа (например, «[45.4, 45.6, 45.8, 46, 46.2]»). – Domenic

+0

Можете ли вы показать, как будет выглядеть код 'getAs'? – Domenic