1

在使用 play 框架时,我似乎对如何正确反序列化 json 感到困惑。使用 jerkson,您似乎只需要定义一个案例类,然后自动反序列化一个 json 字符串(从 jerkson 文档中窃取)。

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

但是,使用 play 框架,您必须编写大量样板代码来做同样的事情。例如从他们的文档中。

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 工作得很好......这让我相信我肯定做错了什么。

谢谢

4

2 回答 2

1

我认为你的问题有两个答案。

  1. 对于较少的样板,您可以使用 Play 支持来处理案例类。这是具有三个字段的案例类的示例:

    隐式 val SampleSetFormat: Format[SampleSet] = productFormat3("sensorId", "times", "values")(SampleSet)(SampleSet.unapply)

  2. 我同意有更多令人讨厌的样板,这是 Play 人员似乎使用这种方法的主要原因,因此他们可以完全在编译时确定正确的序列化程序。因此,无需像 Jerkson 那样进行反思。

于 2012-07-29T18:41:06.110 回答
0

我完全是 Play 和 Jerkson 的菜鸟,但全心全意地建议使用最少的样板方法(在每个动作中使用 Jerkson 库)。我发现这样做在哲学上更符合 Scala,而且效果很好。

于 2012-12-29T00:17:43.423 回答