在使用play框架时,我似乎很困惑如何正确反序列化json。使用jerkson看起来你只需要定义一个case类,然后自动反序列化一个json字符串(从jerkson docs中窃取)。
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工作得很好......这让我相信我肯定做错了什么。
由于
答案 0 :(得分:1)
我认为你的问题有两个答案。
对于较少的锅炉板,您可以使用Play支持处理案例类。以下是包含三个字段的案例类的示例:
隐式val SampleSetFormat:Format [SampleSet] = productFormat3(“sensorId”,“times”,“values”)(SampleSet)(SampleSet.unapply)
我同意更烦人的锅炉板,Play人员似乎使用这种方法的主要原因是他们可以在编译时完全确定正确的序列化器。所以没有像Jerkson那样反映的费用。
答案 1 :(得分:0)
我是Play和Jerkson的总菜鸟,但我全心全意地建议采用最少的样板方法(在每个Action中使用Jerkson lib)。我发现它在哲学上更符合Scala,它可以正常工作。