【问题标题】:Scala Salat Deserialization: how to get a Map[String, Number]?Scala Salat 反序列化:如何获取 Map[String, Number]?
【发布时间】:2014-02-08 00:36:48
【问题描述】:

我的数据库看起来像

[
  {
    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'

我想我可以通过创建一个其唯一字段是Map[String, Number] 的案例类然后获取它的属性来完成这项工作。真的有必要吗?

【问题讨论】:

    标签: mongodb scala casbah salat


    【解决方案1】:

    grater 不将集合作为类型参数,仅将案例类或特征/抽象类作为具体表示形式的案例类。由于您只是在查询地图,因此只需使用getAs[T]DBObject 中提取您需要的值。

    Number 可能不是 Salat 中支持的类型 - 我当然从未尝试过。如果您需要Number,您可以编写自定义转换器或发送拉取请求以添加对 Salat 的真正支持。

    【讨论】:

    • 在我短暂的经验中,Number 是使用 JSON 的唯一方法,否则只要您有非小数(例如 [45.4, 45.6, 45.8, 46, 46.2]),它就会引发异常。
    • 你能展示一下getAs 代码的样子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2014-10-16
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多