2016-03-19 4 views
0

私はlift-jsonをクラス抽出器でbson文字列をレンダリングし、その後、mongo Documentクラスコンストラクタを使用してそのbson文字列を持つドキュメントインスタンスを使用します。lift-jsonのクラスエクストラクタコンストラクタmongo bson arrayの使い方は?

$or bson.Itを表現する方法は古典的なjson配列ではないようです。

{"$or": [ 
     {"username": "administrator"}, 
     {"phone":"110"}, 
     {"email":"[email protected]"}, 
     {"pen_name":"lorancechen"} 
]} 

このbsonアレイを表すリフトクラス抽出器の使い方はありますか?

さらに、appとmongoの間に文字列を使用する理由は、単純なソケットの下で通信するということです。次のように

UPDATE例を追加
抽出通常の配列クラス:

import net.liftweb.json._ 
import net.liftweb.json.Extraction._ 

case class Name(name: String) 
case class JsonArray(array:List[Name]) 

object JsonClient extends App { 
    implicit val formats = DefaultFormats 

    val names = Name("jone01") :: Name("jone02") :: Nil 
    val array = JsonArray(names) 
    val jsonString = prettyRender(decompose(array)) 
    println(jsonString) 
} 

がOUTPUT:この

{"$or": [ 
     {"username": "administrator"}, 
     {"phone":"110"}, 
     {"email":"[email protected]"}, 
     {"pen_name":"lorancechen"} 
]} 

すべてのフィールドのキーを表現する方法

{ 
    "array":[ 
    { 
     "name":"jone01" 
    }, 
    { 
     "name":"jone02" 
    } 
    ] 
} 

(例えば、username,)は、内部の "$ or"要素は共通のキー名ではなく、クラステンプレートを使用する方法を見つけることができません。

+0

なぜこれは通常の配列ではないと思いますか?ドキュメントは配列ではありません。すべてのドキュメントキーを配列の個々の要素として表現する方法を尋ねていますか? –

+0

@BlakesSeven、私は例を追加しました。私はそれが私の不思議なものをまっすぐに表現すると思います。 – LoranceChen

+0

実際にコードを自分でテストすることなく、出力に実際に 'array'という名前のキーが含まれていると言っていますか?それでも、 'JsonArray(names) 'の出力は' $ or'(文書の配列を使用する)の入力として直接作成されません。それは最も単純な使い方のようです。 –

答えて

0

あなたのJSON構造がそのようである理由私はそれを得ることはありません、多分何がしたいことは、次のいずれかになります。

{ 
    "$or": [ 
    { 
     "username": "administrator", "phone":"110", 
     "email":"[email protected]", "pen_name":"lorancechen" 
    }, 
    { 
     "username": "xxx", "phone":"xxx", 
     "email":"xxx", "pen_name":"xxx" 
    } 
    ... 
    ] 
} 

が実際に持ち上げては、このようなツールを提供し、欠点は、実装が少しあるということです醜い。

import net.liftweb.mongodb.{JsonObjectMeta, JsonObject} 

    // the trait here is for unifying the type of 
    //four case classes i.e Username, Phone.... 
    sealed trait PersonField 

    object Username extends JsonObjectMeta[Username] 
    case class Username(username: String) extends JsonObject[Username] 
    with PersonField { 
    def meta = Username 
    } 

    case class Phone(phone: String) extends JsonObject[Phone] with PersonField { 
    def meta = Phone 
    } 
    object Phone extends JsonObjectMeta[Phone] 

    case class Email(email: String) extends JsonObject[Email] with PersonField { 
    def meta = Email 
    } 
    object Email extends JsonObjectMeta[Email] 

    case class PenName(pen_name: String) extends JsonObject[PenName] 
    with PersonField { 
    def meta = PenName 
    } 
    object PenName extends JsonObjectMeta[PenName] 

    case class Output(`$or`: List[PersonField]) extends JsonObject[Output] { 
    def meta = Output 
    } 

    object Output extends JsonObjectMeta[Output] 


    object JsonClient extends App { 

    val username = Username("administrator") 
    val phone = Phone("110") 
    val email = Email("[email protected]") 
    val penName = PenName("lorancechen") 
    val outPut = Output(username :: phone :: email :: penName :: Nil) 

    import net.liftweb.json._ 
    implicit val formats = DefaultFormats 

    import net.liftweb.json.{JsonAST, Printer} 
    val result = Printer.pretty(JsonAST.render(outPut.asJObject)) 

    /* 
     { 
      "$or":[{ 
      "username":"administrator" 
      },{ 
      "phone":"110" 
      },{ 
      "email":"[email protected]" 
      },{ 
      "pen_name":"lorancechen" 
      }] 
     } 

    */ 
    println(result) 
    } 

とにかく、助けてください。

+0

ありがとう、アレン。私はJson構造のためのmongoモジュールを作る準備ができていませんが、これらのクラスとうまく動作します。 :-) – LoranceChen

関連する問題