2016-03-19 13 views
0

Ich benutze Lift-Json render eine Bson-String mit Klasse Extraktor, danach verwenden Sie Mongo Document Klassenkonstruktor eine Dokument-Instanz mit dieser Bson-Zeichenfolge.Wie Lift-Json Klasse Extraktor Konstruktor Mongo Bson Array zu verwenden?

Ein Problem ist, wie repräsentieren $or bson.Es scheint nicht ein klassisches JSON-Array.

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

Wie Lift-Klasse-Extraktor verwenden, stellen Sie diese Bson-Array?

Außerdem der Grund für die Verwendung Zeichenfolge zwischen App und Mongo ist sie unter einem einfachen Socket kommunizieren.

UPDATE hinzufügen Beispiel
Extraktor eine normale Array-Klasse wie folgt:

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:

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

Wie diese vertreten

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

jeden Feldschlüssel (zB username, phone) von Element inneren "$ oder" ist kein gemeinsamer Schlüsselname und ich habe keinen Weg gefunden, es zu repräsentieren verwenden Klassenvorlage.

+0

Warum denken Sie, das ist kein normales Array? Ein Dokument ist kein Array. Fragen Sie, wie Sie alle Dokumentschlüssel als einzelne Elemente in einem Array darstellen? –

+0

@BlakesSeven, ich habe ein Beispiel hinzugefügt.Ich denke, es wird direkt auszudrücken, was ist mein Wunder. – LoranceChen

+0

Ohne den Code selbst zu testen, sagst du, dass die Ausgabe tatsächlich den Schlüssel 'array' enthält? Würde die Ausgabe von 'JsonArray (names)' nicht direkt als Eingabe von '$ or' (die ein Array von Dokumenten verwendet) erstellt. Das scheint die einfachste Verwendung zu sein. –

Antwort

0

ich es nicht bekommen, warum Ihre JSON Struktur auf diese Weise ist, vielleicht, was Sie wollen, ist die folgende:

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

Eigentlich bietet Heben solche Werkzeuge und der Nachteil ist, dass die Umsetzung ist ein bisschen hässlich.

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

Wie auch immer, ich hoffe, es hilft.

+0

Danke, Allen. Obwohl ich nicht bereit bin, ein Mongo-Modul für die Json-Struktur zu bauen, funktioniert es gut mit diesen Klassen. :-) – LoranceChen