如何在Scala / Play中将Casbah MongoDB列表转换为JSON

11

我目前正在学习Scala和MongoDB,并使用Play!框架,因此在理解各种事物时会犯很多错误。目前我有一个Scala对象,通过casbah执行Mongodb查询并返回数据库对象列表,代码如下:

object Alerts  {

   def list() : List[DBObject]= {

        val collection = MongoDatabase.collection;
        val query = MongoDBObject.empty
        val order = MongoDBObject("Issue Time:" -> -1)
        val list = collection.find(query).sort(order).toList
        list
   }

在我的代码中的其他位置,我希望以Json格式输出对象列表 - 所以我有:

  val currentAlerts = Alerts.list()

我想要写的内容是这样的:

  val resultingJson = currentAlerts.toJson 

但是当我这样做时,可以理解地得到以下错误信息:

  value toJson is not a member of List[com.mongodb.casbah.Imports.DBObject]

我的问题是 - 如何将一个com.mongodb.casbah.Imports.DBObject列表转换为Json输出的正确方法是什么?

编辑:

为了更清晰,我真正想做的是相当于

val listInJson = collection.find(query).sort(order).toJson

我可以写同样的方式

val listAsString = collection.find(query).sort(order).toString

1
你为什么需要将数据转换为JSON格式呢?它在数据库中已经以JSON格式(实际上是BSON)存储了,你真的需要将其转换回来吗?我认为你只需要根据所需的结构将数据复制到一个对象中,然后将其序列化为JSON即可... - aishwarya
1
我需要将其输出为JSON格式,以便Web服务进行消费。 - Roger
@Roger,你找到一个优雅的解决方案了吗? - Kevin Meredith
看起来在Play 2.1+中,reactivemongo是处理JSON 'coast-to-coast'的新方法。这里有一个示例项目 - k.c. sham
自从被问及使用案例以来,我的目标是能够提供结果的“漂亮打印”(pretty printing)。据我所知,MongoDB API 并不提供任何 DBObject 的漂亮打印。因此,我想要将其转换为像 spray-json 这样的工具,并在那里进行漂亮打印。但对于原始的 JSON,我将简单地使用 DBObject 的 toString 方法。 - akauppi
显示剩余2条评论
3个回答

8

您可以尝试

com.mongodb.util.JSON.serialize(Alerts.list())

这应该返回一个包含您的警报的JSON数组。

5

我有以下内容

def service() = Action {
 // connect
 val collection = MongoConnection()("someDB")("someCollection")
 // simply convert the result to a string, separating items with a comma
 // this string goes inside an "array", and it's ready to hit the road
 val json = "[%s]".format(
  collection.find(someQuery).toList.mkString(",")
 )

 Ok(json).as("application/json")

}


4
我有一个可怕的解决方案,如下所示;
val currentAlerts = Alerts.list()

var jsonList : List[JsValue] = Nil

// Iterate over the DBObjects and use to String to convert each to JSON
// and then parse that back into the list so we can use toJson on it later.
// MAD, but works.

for (dbObject <- currentAlerts) {
    jsonList ::=  Json.parse(dbObject.toString)
}

val result = Json.toJson(jsonList)
Ok(result).as("application/json")

一定有更好的方法吧?


嘿,罗杰,你有没有找到更好的方法将Casbah DBObject转换为Play的JsValue? - teo
在获取result后,您将如何将其键值字段填充到映射中? - Kevin Meredith
这实际上是一个很棒的想法!如果性能不重要(例如在漂亮打印时),这就是完美的。谢谢。 - akauppi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接