Десериализация Scala Salat: как получить карту [строка, число]?

Моя база данных выглядит так

[
  {
    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], а затем получив его свойство. Это действительно необходимо?


person Domenic    schedule 08.02.2014    source источник


Ответы (1)


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

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

person prasinous    schedule 08.02.2014
comment
Number — единственный способ работать с JSON в моем коротком опыте, поскольку в противном случае он генерирует исключение всякий раз, когда у вас есть не дробные числа (например, [45.4, 45.6, 45.8, 46, 46.2]). - person Domenic; 09.02.2014
comment
Можете ли вы показать, как будет выглядеть код getAs? - person Domenic; 09.02.2014