如何将MongoDBObject转换为JsonString

如何将MongoDBObject转换为JsonString,mongodb,scala,lift,specs2,casbah,Mongodb,Scala,Lift,Specs2,Casbah,我的mongoDb集合如下所示: > db.FakeCollection.find().pretty() { "_id" : ObjectId("52b2d71c5c197846fd3a2737"), "categories" : [ { "categoryname" : "entertainment", "categoryId" : "d3ffca550ae44904a

我的mongoDb集合如下所示:

> db.FakeCollection.find().pretty()
{
    "_id" : ObjectId("52b2d71c5c197846fd3a2737"),
    "categories" : [
            {
                    "categoryname" : "entertainment",
                    "categoryId" : "d3ffca550ae44904aedf77cdcbd31d7a",
                    "displayname" : "Entertainment",
                    "subcategories" : [
                            {
                                    "subcategoryname" : "games",
                                    "subcategoryId" : "ff3d0cbeb0eb4960b11b47d7fc64991b",
                                    "displayname" : "Games"
                            }
                    ]
            }
    ]
   }
我想使用scala中的Specs2 JsonMatchers和MongodbCasbah为以下集合编写一个测试用例。
如何将DBObjects转换为字符串?

我认为您的方法在这里有点错误。您的收藏应该如下所示:

class Category extends BsonRecord[Category] {
  def meta = Category
  object categoryname extends StringField(this, 200)
  object categoryId extends StringField(this, 64)
  object displayname extends StringField(this, 100)
  object subcategories extends BsonRecordListField(this, Category)
}
object Category extends Category with BsonMetaRecord[Category] {
}

class FakeCollection extends MongoRecord[FakeCollection] with ObjectIdPk[FakeCollection] {
  def meta = FakeCollection
  object categories extends BsonRecordListField(this, Category)
}
object FakeCollection extends FakeCollection with MongoMetaRecord[FakeCollection] {
  override def collectionName = "fakecollection"
  def getEntryByName: List[Category] = {
    FakeCollection.find
  }
}
使用该方法,您可以执行以下操作:

import net.liftweb.json.JsonAST.JValue;
import net.liftweb.http.js.JsExp;
import net.liftweb.http.js.JsExp._;
import net.liftweb.json.JsonDSL.seq2jvalue
val json: JsExp = seq2JValue(FakeColleciton.find.map(_.asJValue))
val stringContent = json.toJsCmd; // now it's here, you can match.

看看如何添加Foursquare Rogue,让您的生活更轻松。

我相信您的方法在这里有点错误。您的收藏应该如下所示:

class Category extends BsonRecord[Category] {
  def meta = Category
  object categoryname extends StringField(this, 200)
  object categoryId extends StringField(this, 64)
  object displayname extends StringField(this, 100)
  object subcategories extends BsonRecordListField(this, Category)
}
object Category extends Category with BsonMetaRecord[Category] {
}

class FakeCollection extends MongoRecord[FakeCollection] with ObjectIdPk[FakeCollection] {
  def meta = FakeCollection
  object categories extends BsonRecordListField(this, Category)
}
object FakeCollection extends FakeCollection with MongoMetaRecord[FakeCollection] {
  override def collectionName = "fakecollection"
  def getEntryByName: List[Category] = {
    FakeCollection.find
  }
}
使用该方法,您可以执行以下操作:

import net.liftweb.json.JsonAST.JValue;
import net.liftweb.http.js.JsExp;
import net.liftweb.http.js.JsExp._;
import net.liftweb.json.JsonDSL.seq2jvalue
val json: JsExp = seq2JValue(FakeColleciton.find.map(_.asJValue))
val stringContent = json.toJsCmd; // now it's here, you can match.

看看如何添加Foursquare Rogue,让您的生活更轻松。

我相信您的方法在这里有点错误。您的收藏应该如下所示:

class Category extends BsonRecord[Category] {
  def meta = Category
  object categoryname extends StringField(this, 200)
  object categoryId extends StringField(this, 64)
  object displayname extends StringField(this, 100)
  object subcategories extends BsonRecordListField(this, Category)
}
object Category extends Category with BsonMetaRecord[Category] {
}

class FakeCollection extends MongoRecord[FakeCollection] with ObjectIdPk[FakeCollection] {
  def meta = FakeCollection
  object categories extends BsonRecordListField(this, Category)
}
object FakeCollection extends FakeCollection with MongoMetaRecord[FakeCollection] {
  override def collectionName = "fakecollection"
  def getEntryByName: List[Category] = {
    FakeCollection.find
  }
}
使用该方法,您可以执行以下操作:

import net.liftweb.json.JsonAST.JValue;
import net.liftweb.http.js.JsExp;
import net.liftweb.http.js.JsExp._;
import net.liftweb.json.JsonDSL.seq2jvalue
val json: JsExp = seq2JValue(FakeColleciton.find.map(_.asJValue))
val stringContent = json.toJsCmd; // now it's here, you can match.

看看如何添加Foursquare Rogue,让您的生活更轻松。

我相信您的方法在这里有点错误。您的收藏应该如下所示:

class Category extends BsonRecord[Category] {
  def meta = Category
  object categoryname extends StringField(this, 200)
  object categoryId extends StringField(this, 64)
  object displayname extends StringField(this, 100)
  object subcategories extends BsonRecordListField(this, Category)
}
object Category extends Category with BsonMetaRecord[Category] {
}

class FakeCollection extends MongoRecord[FakeCollection] with ObjectIdPk[FakeCollection] {
  def meta = FakeCollection
  object categories extends BsonRecordListField(this, Category)
}
object FakeCollection extends FakeCollection with MongoMetaRecord[FakeCollection] {
  override def collectionName = "fakecollection"
  def getEntryByName: List[Category] = {
    FakeCollection.find
  }
}
使用该方法,您可以执行以下操作:

import net.liftweb.json.JsonAST.JValue;
import net.liftweb.http.js.JsExp;
import net.liftweb.http.js.JsExp._;
import net.liftweb.json.JsonDSL.seq2jvalue
val json: JsExp = seq2JValue(FakeColleciton.find.map(_.asJValue))
val stringContent = json.toJsCmd; // now it's here, you can match.
看看如何添加Foursquare Rogue,让您的生活更轻松。

简短回答:

val doc: com.mongodb.DBObject = ???
pretty(render(net.liftweb.mongodb.JObjectParser.serialize(doc)))
答案很长,可以解释发生了什么。为了清晰起见,我包括了完整的类型名称:

import net.liftweb.mongodb.JObjectParser
import net.liftweb.json.DefaultFormats

// default JSON formats for `parse` and `serialize` below
implicit val formats = DefaultFormats

// Convert DBObject to JValue:
val doc: com.mongodb.DBObject = ??? // get it somehow
val jsonDoc: net.liftweb.json.JValue = JObjectParser.serialize(doc)

// Convert JValue to DBObject:
val doc2: net.liftweb.json.JObject = ???
val dbObj: com.mongodb.DBObject = JObjectParser.parse(doc2)

// Render JSON as String:
import net.liftweb.json._
pretty(render(jsonDoc))
// or use compactRender, compact(render(jsonDoc)), etc
要比较JSON文档,有Diff:
val Diff(更改、添加、删除)=json1 Diff json2

更多信息请点击此处:

您可以使用specs2进行测试,并以这种方式提升差异,例如:

json1 diff json2 mustEqual Diff(changedJson, addedJson, JNothing)
简短答复:

val doc: com.mongodb.DBObject = ???
pretty(render(net.liftweb.mongodb.JObjectParser.serialize(doc)))
答案很长,可以解释发生了什么。为了清晰起见,我包括了完整的类型名称:

import net.liftweb.mongodb.JObjectParser
import net.liftweb.json.DefaultFormats

// default JSON formats for `parse` and `serialize` below
implicit val formats = DefaultFormats

// Convert DBObject to JValue:
val doc: com.mongodb.DBObject = ??? // get it somehow
val jsonDoc: net.liftweb.json.JValue = JObjectParser.serialize(doc)

// Convert JValue to DBObject:
val doc2: net.liftweb.json.JObject = ???
val dbObj: com.mongodb.DBObject = JObjectParser.parse(doc2)

// Render JSON as String:
import net.liftweb.json._
pretty(render(jsonDoc))
// or use compactRender, compact(render(jsonDoc)), etc
要比较JSON文档,有Diff:
val Diff(更改、添加、删除)=json1 Diff json2

更多信息请点击此处:

您可以使用specs2进行测试,并以这种方式提升差异,例如:

json1 diff json2 mustEqual Diff(changedJson, addedJson, JNothing)
简短答复:

val doc: com.mongodb.DBObject = ???
pretty(render(net.liftweb.mongodb.JObjectParser.serialize(doc)))
答案很长,可以解释发生了什么。为了清晰起见,我包括了完整的类型名称:

import net.liftweb.mongodb.JObjectParser
import net.liftweb.json.DefaultFormats

// default JSON formats for `parse` and `serialize` below
implicit val formats = DefaultFormats

// Convert DBObject to JValue:
val doc: com.mongodb.DBObject = ??? // get it somehow
val jsonDoc: net.liftweb.json.JValue = JObjectParser.serialize(doc)

// Convert JValue to DBObject:
val doc2: net.liftweb.json.JObject = ???
val dbObj: com.mongodb.DBObject = JObjectParser.parse(doc2)

// Render JSON as String:
import net.liftweb.json._
pretty(render(jsonDoc))
// or use compactRender, compact(render(jsonDoc)), etc
要比较JSON文档,有Diff:
val Diff(更改、添加、删除)=json1 Diff json2

更多信息请点击此处:

您可以使用specs2进行测试,并以这种方式提升差异,例如:

json1 diff json2 mustEqual Diff(changedJson, addedJson, JNothing)
简短答复:

val doc: com.mongodb.DBObject = ???
pretty(render(net.liftweb.mongodb.JObjectParser.serialize(doc)))
答案很长,可以解释发生了什么。为了清晰起见,我包括了完整的类型名称:

import net.liftweb.mongodb.JObjectParser
import net.liftweb.json.DefaultFormats

// default JSON formats for `parse` and `serialize` below
implicit val formats = DefaultFormats

// Convert DBObject to JValue:
val doc: com.mongodb.DBObject = ??? // get it somehow
val jsonDoc: net.liftweb.json.JValue = JObjectParser.serialize(doc)

// Convert JValue to DBObject:
val doc2: net.liftweb.json.JObject = ???
val dbObj: com.mongodb.DBObject = JObjectParser.parse(doc2)

// Render JSON as String:
import net.liftweb.json._
pretty(render(jsonDoc))
// or use compactRender, compact(render(jsonDoc)), etc
要比较JSON文档,有Diff:
val Diff(更改、添加、删除)=json1 Diff json2

更多信息请点击此处:

您可以使用specs2进行测试,并以这种方式提升差异,例如:

json1 diff json2 mustEqual Diff(changedJson, addedJson, JNothing)


我们没有使用Lift-Record,我们使用的是MongoDB-CasbahI,每当我处理一个稳定且已知的模式时,我也更喜欢Rogue。他们有非常类型安全的方式来查询数据库。然而,在我的一个项目中,我不得不使用casbah,用任意字段构造文档,并进行任意查询。对于这类事情,Rogue+Record根本不适合。不过,这对我来说更像是一个例外。@AlekseyIzmailov:我为这个插件道歉,但这是否意味着Rogue+Record也不太适合一个不断变化的模式?@ErikAllik我认为使用Record的全部目的是要有一种类型安全的模式访问方式,而实现它的唯一方法是在模式中不要有太多变化。您仍然可以有可选字段,但在这种情况下,目的可能很快就会失败。如果您经常更改模式,那么只要执行数据迁移就可以了,但是如果单个集合中的文档没有公共模式,或者在运行时发生了更改,那么Rogue就不太合适了。我想在使用Rogue的同时进行动态/增量模式迁移,但我想我必须坚持迁移。我们没有使用Lift-Record,我们使用的是MongoDB-CasbahI,每当我处理一个稳定且已知的模式时,我也更喜欢Rogue。他们有非常类型安全的方式来查询数据库。然而,在我的一个项目中,我不得不使用casbah,用任意字段构造文档,并进行任意查询。对于这类事情,Rogue+Record根本不适合。不过,这对我来说更像是一个例外。@AlekseyIzmailov:我为这个插件道歉,但这是否意味着Rogue+Record也不太适合一个不断变化的模式?@ErikAllik我认为使用Record的全部目的是要有一种类型安全的模式访问方式,而实现它的唯一方法是在模式中不要有太多变化。您仍然可以有可选字段,但在这种情况下,目的可能很快就会失败。如果您经常更改模式,那么只要执行数据迁移就可以了,但是如果单个集合中的文档没有公共模式,或者在运行时发生了更改,那么Rogue就不太合适了。我想在使用Rogue的同时进行动态/增量模式迁移,但我想我必须坚持迁移。我们没有使用Lift-Record,我们使用的是MongoDB-CasbahI,每当我处理一个稳定且已知的模式时,我也更喜欢Rogue。他们有非常类型安全的方式来查询数据库。然而,在我的一个项目中,我不得不使用casbah,用任意字段构造文档,并进行任意查询。对于这类事情,Rogue+Record根本不适合。不过,这对我来说更像是一个例外。@AlekseyIzmailov:我为这个插件道歉,但这是否意味着Rogue+Record也不太适合一个不断变化的模式?@ErikAllik我认为使用Record的全部目的是要有一种类型安全的模式访问方式,而实现它的唯一方法是在模式中不要有太多变化。您仍然可以有可选字段,但在这种情况下,目的可能很快就会失败。如果您经常更改模式,那么只要执行数据迁移就可以了,但是如果单个集合中的文档没有公共模式,或者在运行时发生了更改,那么Rogue就不太合适了。我想在使用Rogue的同时进行动态/增量模式迁移,但我想我必须坚持迁移。我们没有使用Lift-Record,我们使用的是MongoDB-CasbahI,当我处理一个稳定且已知的sc时,我也更喜欢Rogue