【问题标题】:deserialize using Play framework ScalaJsonGenerics vs Jerkson使用 Play 框架 ScalaJsonGenerics vs Jerkson 反序列化
【发布时间】:2012-06-06 00:36:31
【问题描述】:

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

谢谢

【问题讨论】:

  • 有人认识这个吗?我做了一些贫民窟的事情,只是将这两个概念混合在一起def reads(json: JsValue) = Json.parse[Cacheref](json.toString)。似乎不可能是正确的

标签: json playframework


【解决方案1】:

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

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

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

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

【讨论】:

  • 有没有什么办法让productFormat函数只用于阅读?阅读时我通常有一个简单的表示,但是当我写回 JSON 时,我经常需要包含相关模型
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多