2013-10-05 44 views
0

我是scala新手,來自Ruby背景,所以在我的web服務中使用scalatra,mongodb和liftweb呈現json響應時遇到問題mongo記錄和argonaut爲JSon序列化和反序列化。Scala toJson當使用net.liftweb.mongodb.record.MongoRecord和Argonaut

但是基於http://argonaut.io/給出的例子,我無法弄清楚在使用net.liftweb.mongo.record庫時這是如何工作的。

在編譯時,我得到一個錯誤,說一個type mismatch。錯誤描述遵循代碼片段。

 

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


我的錯誤是

 

[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 
 

因爲構造函數不接受任何參數和蒙戈庫,它似乎是合乎邏輯似乎產生val的,我需要的類中的字段(我仍然不完全明白什麼是電梯蒙戈包裝)。

那麼我該如何定義隱式才能找到serialise類型的對象。

另外我如何在處理集合時定義序列化功能。例如,當我有一個List[Person]

在此先感謝。我真的很感激任何幫助,我可以得到這一點。

回答

0

我即將開始使用Argonaut,所以我不是那方面的專家,但說那最初的問題似乎很明顯。

casecodec3需要爲您定義編解碼器的類構造函數和解構器。在Argonaut的例子中,他們使用的是案例類,它們自動生成伴隨對象,其中包含apply/unapply用於定義的字段。哪一個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,所以如果你仍然卡住(可能不是),我可能會稍微好一點。