使用net.liftweb.mongodb.record.MongoRecord和Argonaut时使用Scala-toJson

使用net.liftweb.mongodb.record.MongoRecord和Argonaut时使用Scala-toJson,json,scala,serialization,Json,Scala,Serialization,我是scala新手,来自Ruby背景,因此在我的web服务中呈现json响应时遇到问题,我使用scalatra、mongodb和liftweb mongo记录以及argonaut进行json序列化和反序列化 然而,根据在上给出的示例,我无法理解在使用net.liftweb.mongo.record库时这将如何工作 编译时,我得到一个错误,它表示类型不匹配。错误描述在代码段之后 package firstscalatraapp import org.scalatra import net.lif

我是scala新手,来自Ruby背景,因此在我的web服务中呈现json响应时遇到问题,我使用scalatra、mongodb和liftweb mongo记录以及argonaut进行json序列化和反序列化

然而,根据在上给出的示例,我无法理解在使用net.liftweb.mongo.record库时这将如何工作

编译时,我得到一个错误,它表示
类型不匹配
。错误描述在代码段之后

package firstscalatraapp import org.scalatra import net.liftweb.mongodb._ import net.liftweb.mongodb.record.MongoRecord import net.liftweb.mongodb.record.field.ObjectIdPk import net.liftweb.record.field.StringField import net.liftweb.record.field.IntField import net.liftweb.record.field.PasswordField import net.liftweb.record.field.DateTimeField import net.liftweb.mongodb.record.MongoMetaRecord import argonaut._ import Argonaut._ case class Person private extends MongoRecord[Person] with ObjectIdPk[Person] { def meta = Person object age extends IntField(this, 3) object name extends StringField(this, 29) object created_at extends DateTimeField(this) object password extends PasswordField(this) } object Person extends Person with MongoMetaRecord[Person] { implicit def PersonCodecJson: CodecJson[Person] = casecodec3(Person.apply, Person.unapply)("name", "age", "things") } 这似乎合乎逻辑,因为构造函数不接受任何参数,而mongo库似乎正在为类所需的字段生成
val
(我仍然不完全理解lift mongo包装器的功能)

那么我如何定义隐式,以便能够找到person类型的序列化对象呢

另外,在处理集合时,如何定义序列化功能。例如,当我有一个
列表[Person]


提前谢谢。我真的非常感谢在这方面能得到的任何帮助。

我正要开始使用Argonaut,所以我不是这方面的专家,但话说回来,您最初的问题似乎很明显

casecodec3需要一个构造函数和一个解构器,用于定义编解码器的类。在Argonaut的示例中,它们使用case类,并且这些类已经自动为定义的字段生成了带有apply/unapply的伴随对象。对于casecodec3,它必须是3。在您的例子中,case类是零算术的-您根本没有case类字段。记录的字段被定义为具有自己的apply方法(非常重要的东西)的内部对象。这就是电梯记录的定义方式。所以您的apply方法就是()=>Person

casecodec3需要一个从3元组到Person以及从Person到3元组的函数。如果要使用lift记录,我建议跳过案例定义。并在侧面创建函数。比如:

object Person extends Person with MongoMetaRecord[Person] {
 implicit def PersonCodecJson: CodecJson[Person] =
  casecodec3(parse, serialize)("name", "age", "things")

  // Something like
  def parse(name: String, age: Int, things: Something) = {
    val p = Person.createRecord
    p.name(name)
    ...
  }

  def serialize(p: Person) = (p.name.get, p.age.get, p.things.get)

} 
至于你的其他问题,我想你可以再回到argonaut.io。他们的文档似乎很好-当你发布这个问题时可能会更糟,因为它有点旧

我现在将尝试替换从liftJSON到argonaut的所有序列化,这样,如果您仍然卡住(可能没有),我可能会在一点时间内回答得更好

object Person extends Person with MongoMetaRecord[Person] {
 implicit def PersonCodecJson: CodecJson[Person] =
  casecodec3(parse, serialize)("name", "age", "things")

  // Something like
  def parse(name: String, age: Int, things: Something) = {
    val p = Person.createRecord
    p.name(name)
    ...
  }

  def serialize(p: Person) = (p.name.get, p.age.get, p.things.get)

}