Как конвертировать MongoDBObject в JsonString

Моя коллекция mongoDb выглядит так:

> db.FakeCollection.find().pretty()
{
    "_id" : ObjectId("52b2d71c5c197846fd3a2737"),
    "categories" : [
            {
                    "categoryname" : "entertainment",
                    "categoryId" : "d3ffca550ae44904aedf77cdcbd31d7a",
                    "displayname" : "Entertainment",
                    "subcategories" : [
                            {
                                    "subcategoryname" : "games",
                                    "subcategoryId" : "ff3d0cbeb0eb4960b11b47d7fc64991b",
                                    "displayname" : "Games"
                            }
                    ]
            }
    ]
   }

Я хочу написать контрольный пример для коллекции ниже, используя Specs2 JsonMatchers в Scala с MongodbCasbah. Как я могу конвертировать DBObjects в строки?

2 ответа

Решение

Короткий ответ:

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(changed, added, deleted) = json1 diff json2,

Более подробная информация здесь: https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/.

Вы можете проверить с помощью specs2 и Lift Diff, например:

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

Я считаю, что ваш подход здесь немного ошибочен. Ваша коллекция должна выглядеть так:

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, чтобы сделать вашу жизнь проще.

Другие вопросы по тегам