2013-12-19 3 views
0
коллекция

My MongoDB выглядит следующим образом:Как конвертировать MongoDBObject в JsonString

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

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

ответ

1

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

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) 
2

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

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. 

Посмотри HERE, посмотреть, как вы можете добавить Foursquare Rogue, чтобы сделать вашу жизнь проще.

+0

мы не используем Lift записи мы используем MongoDB Casbah – sagar

+2

Я также предпочитаю Rogue всякий раз, когда я имею дело со стабильной и известной схеме. У них очень безопасный способ запроса БД. Однако в одном из моих проектов мне пришлось использовать casbah и создавать документы с произвольными полями и делать произвольные запросы. Для таких вещей Rogue + Record просто не подходит. Для меня это скорее исключительный случай. –

+0

@AlekseyIzmailov: Я прошу прощения за вилку, но означает ли это, что Rogue + Record также плохо подходит для меняющейся схемы? –

Смежные вопросы