0

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

但是,根据http://argonaut.io/给出的示例,我无法弄清楚在使用 net.liftweb.mongo.record 库时这是如何工作的。

在编译这个我得到一个错误,上面写着type mismatch. 错误描述跟在代码片段后面。

首先打包scalatraapp

导入 org.scalatra
导入 net.liftweb.mongodb._
导入 net.liftweb.mongodb.record.MongoRecord
导入 net.liftweb.mongodb.record.field.ObjectIdPk

导入 net.liftweb.record.field.StringField
导入 net.liftweb.record.field.IntField
导入 net.liftweb.record.field.PasswordField
导入 net.liftweb.record.field.DateTimeField
导入 net.liftweb.mongodb.record.MongoMetaRecord
进口argonaut._
导入 Argonaut._

case class Person private 用 ObjectIdPk[Person] 扩展 MongoRecord[Person] {
    def meta = 人   
    对象年龄扩展 IntField(this, 3)
    对象名称扩展 StringField(this, 29)
    对象 created_at 扩展 DateTimeField(this)
    对象密码扩展 PasswordField(this)
}

对象 Person 使用 MongoMetaRecord[Person] {
 隐式 def PersonCodecJson: CodecJson[Person] =
  casecodec3(Person.apply, Person.unapply)("name", "age", "things")
}


我得到的错误是


[error]  found   : () => firstscalatraapp.Person
[error]  required: (?, ?, ?) => ?
[error]   casecodec3(Person.apply, Person.unapply)("name", "age", "things")
[error]                     ^
[error] one error found
[error] (compile:compile) Compilation failed

这似乎是合乎逻辑的,因为构造函数不接受任何参数,并且 mongo 库似乎正在val为我需要的类生成字段(我仍然不完全理解 lift mongo 包装器的作用)。

那么我如何定义隐式以便能够找到序列化人员类型的对象。

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

提前致谢。我真的很感激我能得到的任何帮助。

4

1 回答 1

0

我即将开始使用 Argonaut,所以我不是这方面的专家,但话虽如此,你最初的问题似乎很明显。

casecodec3 需要为要为其定义编解码器的类的构造函数和解构函数。在 Argonaut 的示例中,他们使用案例类,并且这些类已经自动生成伴随对象,并为定义的字段应用/取消应用。casecodec3 需要为 3。在您的情况下,案例类的数量为零 - 您根本没有案例类字段。记录的字段被定义为具有自己应用方法的内部对象(非常必要的东西)。这就是电梯记录的定义方式。所以你的应用方法就是 () => Person。

casecodec3 想要一个从 3 元组到 Person 以及从 Person 到 3 元组的函数。如果您要使用提升记录,我建议您跳过案例定义。而是在侧面创建功能。就像是:

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。他们的文档似乎还不错——也许当你发布这个问题时情况更糟,因为它有点老了?

我现在将尝试将我所有的序列化从 lift-json 替换为 argonaut,所以如果你仍然被卡住(可能不是),我可能能够更好地回答一下。

于 2014-01-30T14:49:51.190 回答