2012-06-06 22 views
1

在使用關於如何正確反序列化json的框架時,我似乎很困惑。使用jerkson它看起來像你只需要定義一個case類,然後自動反序列化一個json字符串(從jerkson文檔中竊取)。使用Play框架進行反序列化ScalaJsonGenerics vs Jerkson

case class Person(id: Long, name: String) 
parse[Person]("""{"id":1,"name":"Coda"}""") //=> Person(1,"Coda") 

但是,有了遊戲框架,你必須寫很多鍋爐板代碼來做同樣的事情。例如從他們的文檔。

case class Foo(name: String, entry: Int) 

object Foo { 
    implicit object FopReads extends Format[Foo] { 
    def reads(json: JsValue) = Foo(
     (json \ "name").as[String], 
     (json \ "entry").as[Int]) 
    def writes(ts: Foo) = JsObject(Seq(
     "name" -> JsString(ts.name), 
     "entry" -> JsNumber(ts.entry))) 
    } 
} 

這似乎是一個更多的工作,所以我假設我要麼沒有正確使用它,或不太明白這樣做的好處。是否有捷徑,以便我不必編寫所有這些代碼?如果沒有,我是否應該在Action中使用jerkson來解析傳入的json字符串?似乎asText正在返回一個空白字符串,即使asJson工作的很好......這導致我相信我確實做錯了什麼。

謝謝

+0

有誰知道這個嗎?我做了一些貧民窟,只是混合了這兩個概念,像這樣'def reads(json:JsValue)= Json.parse [Cacheref](json.toString)'。似乎它不可能是正確的 – dhrod5

回答

1

我想你的問題有兩個答案。

  1. 對於稍差的鍋爐板,您可以使用Play支持來處理大小寫類。下面是帶有三個字段用於的情況下類的例子:

    隱VAL SampleSetFormat:格式[SampleSet] = productFormat3( 「sensorId」, 「次」, 「值」)(SampleSet)(SampleSet.unapply)

  2. 我同意有更多惱人的鍋爐板,這是Play人們似乎使用這種方法的主要原因,因此他們可以在編譯時完全確定正確的串行器。所以沒有像Jerkson那樣反思的代價。

+0

有什麼方法可以使用productFormat函數僅用於閱讀?閱讀時我通常會有一個簡單的表示,但是當我寫回JSON時,我經常需要包含相關模型 – Andrea

0

我是Play和Jerkson的總noob,但是全心全意地推薦使用最少的樣板方法(在每個Action中使用Jerkson lib)。我發現它在哲學上更符合斯卡拉這樣做,它工作正常。

相關問題