2016-03-19 19 views
0

Ben lift-json sınıf çıkarıcı ile bir bson dize render kullanıyorum, bundan sonra, o bson dize ile bir belge örneği mongo Document sınıf yapıcısı kullanın.Lift-json sınıf çıkarıcı yapıcı mongo bson dizisi nasıl kullanılır?

Sorun, $or bson'unu temsil etmektir. Klasik bir json dizisi yok gibi görünüyor.

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

Kaldırma sınıfı çıkarıcı nasıl kullanılır bu bson dizisini temsil eder? Ayrıca, uygulama ile mongo arasındaki ip kullanımının sebebi de basit bir soket altında iletişim kurmalarıdır.

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

ÇIKIŞ:

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

bu

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

her alan anahtarını temsil etmek nasıl

GÜNCELLEME aşağıdaki gibi bir ömeği
çıkarıcı normal dizi sınıf eklemek (ör. username, phone) öğesinin iç öğesi "$ veya", ortak anahtar adı değildir ve sınıf şablonunu kullanmanın bir yolunu bulamadım.

+0

Bunun neden normal bir dizi olmadığını düşünüyorsunuz? Bir belge bir dizi değil. Tüm belge anahtarlarının bir dizideki bağımsız öğeler olarak nasıl temsil edileceğini mi soruyorsunuz? –

+0

@BlakesSeven, Bir örnek ekledim. Neyin merak ettiğimi ifade edeceğini düşünüyorum. – LoranceChen

+0

Aslında kodu kendim test etmeden, çıktının aslında "array" adlı anahtarı içerdiğini mi söylüyorsun? Öyle olsa bile, JsonArray (isimler) 'den gelen çıktı doğrudan "$ veya" (bir dizi belge kullanan) girdisi olarak oluşturulur. Bu en basit kullanım olarak görünüyor. –

cevap

0

JSON yapısı bu şekilde olmasının nedeni ben alamadım, belki ne istediğinizi aşağıdaki biridir:

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

Aslında kaldırın tür araçlar sağlar ve olumsuz uygulama biraz olmasıdır çirkin.

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

Neyse, umarım yardımcı olur.

+0

Teşekkürler, Allen. Json yapısı için bir mongo modülü oluşturmama rağmen, bu sınıfla iyi çalışır. :-) – LoranceChen