如何使用 lift-json 的 class 提取器构造函数 mongo bson 数组?
How to use lift-json's class extractor constructor mongo bson array?
我使用 lift-json 渲染一个带有 class 提取器的 bson 字符串,之后,使用 mongo Document
class 构造一个文件带有那个 bson 字符串的实例。
问题是如何表示 $or
bson.It 似乎不是 classic json 数组。
{"$or": [
{"username": "administrator"},
{"phone":"110"},
{"email":"123@xxx.com"},
{"pen_name":"lorancechen"}
]}
如何使用 lift class 提取器表示这个 bson 数组?
此外,应用程序和 mongo 之间使用字符串的原因是它们在简单套接字下进行通信。
更新 添加示例
提取一个普通数组 class 如下:
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)
}
输出:
{
"array":[
{
"name":"jone01"
},
{
"name":"jone02"
}
]
}
如何表示这个
{"$or": [
{"username": "administrator"},
{"phone":"110"},
{"email":"123@xxx.com"},
{"pen_name":"lorancechen"}
]}
元素内部“$or”的每个字段键(例如,username
、phone
)都不是通用键名,我还没有找到一种方法来表示它使用 class 模板。
我不明白为什么你的 JSON 结构是这样的,也许你想要的是以下结构:
{
"$or": [
{
"username": "administrator", "phone":"110",
"email":"123@xxx.com", "pen_name":"lorancechen"
},
{
"username": "xxx", "phone":"xxx",
"email":"xxx", "pen_name":"xxx"
}
...
]
}
实际上Lift提供了这样的工具,缺点是实现起来有点难看。
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("123@xxx.com")
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":"123@xxx.com"
},{
"pen_name":"lorancechen"
}]
}
*/
println(result)
}
总之,希望对你有所帮助。
我使用 lift-json 渲染一个带有 class 提取器的 bson 字符串,之后,使用 mongo Document
class 构造一个文件带有那个 bson 字符串的实例。
问题是如何表示 $or
bson.It 似乎不是 classic json 数组。
{"$or": [
{"username": "administrator"},
{"phone":"110"},
{"email":"123@xxx.com"},
{"pen_name":"lorancechen"}
]}
如何使用 lift class 提取器表示这个 bson 数组?
此外,应用程序和 mongo 之间使用字符串的原因是它们在简单套接字下进行通信。
更新 添加示例
提取一个普通数组 class 如下:
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)
}
输出:
{
"array":[
{
"name":"jone01"
},
{
"name":"jone02"
}
]
}
如何表示这个
{"$or": [
{"username": "administrator"},
{"phone":"110"},
{"email":"123@xxx.com"},
{"pen_name":"lorancechen"}
]}
元素内部“$or”的每个字段键(例如,username
、phone
)都不是通用键名,我还没有找到一种方法来表示它使用 class 模板。
我不明白为什么你的 JSON 结构是这样的,也许你想要的是以下结构:
{
"$or": [
{
"username": "administrator", "phone":"110",
"email":"123@xxx.com", "pen_name":"lorancechen"
},
{
"username": "xxx", "phone":"xxx",
"email":"xxx", "pen_name":"xxx"
}
...
]
}
实际上Lift提供了这样的工具,缺点是实现起来有点难看。
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("123@xxx.com")
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":"123@xxx.com"
},{
"pen_name":"lorancechen"
}]
}
*/
println(result)
}
总之,希望对你有所帮助。