如何在Play 2.1中将案例类序列化/反序列化为Json

j3d*_*j3d 14 json scala playframework-2.0 playframework-2.1

我正在尝试将一些案例类序列化/反序列化为Json ...而且在处理只有一个字段的案例类时我遇到了麻烦(我正在使用Play 2.1):

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class MyType(type: String)

object MyType {

  implicit val myTypeJsonWrite = new Writes[MyType] {
    def writes(type: MyType): JsValue = {
      Json.obj(
        "type" -> MyType.type
      )
    }
  }

  implicit val myTypeJsonRead = (
    (__ \ 'type).read[String]
  )(MyType.apply _)
}
Run Code Online (Sandbox Code Playgroud)

上面的代码总是生成以下错误消息:

[error] /home/j3d/Projects/test/app/models/MyType.scala:34: overloaded method value read with alternatives:
[error]   (t: String)play.api.libs.json.Reads[String] <and>
[error]   (implicit r: play.api.libs.json.Reads[String])play.api.libs.json.Reads[String]
[error]  cannot be applied to (String => models.MyType)
[error]     (__ \ 'method).read[String]
[error]                        ^
Run Code Online (Sandbox Code Playgroud)

我知道...包含只是一个字符串没有多大意义的情况下,类...但我需要序列化/反序列化的情况下,类非常相似,我上面描述的来自外部库中的一个.

任何的想法?我错过了什么吗?任何帮助将非常感激...我变得疯狂:-(谢谢.

Jul*_*ont 23

Json组合器不适用于Play 2.1中的单字段案例类(它应该可以在2.2中使用)

Pascal(此API的作者)在此解释了这种情况https://groups.google.com/forum/?fromgroups=#!starred/play-framework/hGrveOkbJ6U

有一些解决方法可行,如下所示:

case class MyType(value: String)
val myTypeRead = (__ \ 'value).read[String].map(v => MyType(v)) // covariant map
Run Code Online (Sandbox Code Playgroud)

ps:type是Scala中的关键字,它不能用作参数名称(但我认为它仅适用于此示例)

编辑:播放2.3.X时尚未需要此解决方法.宏工作正常.

  • 我正在使用Play 2.3(Scala),我还需要解决这个限制.我不认为它已经修好了. (3认同)
  • 您可以通过在反引号中包装字段名称来捕获JSON序列化案例类中的`type`.我无法弄清楚如何在markdown中向你展示,因为反引号是代码块:) (2认同)