2012-06-06 18 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)。我发现它在哲学上更符合斯卡拉这样做,它工作正常。

相关问题