json - 如何在 Play 2.1 中将案例类序列化到 Json 或从 Json 反序列化

标签 json scala playframework-2.0 playframework-2.1

我正在尝试将一些案例类序列化为 Json 或从 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 _)
}

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

[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]                        ^

我知道...仅包含字符串的案例类没有多大意义...但我需要序列化/反序列化一个与我上面描述的来自外部库的案例类非常相似的案例类。

有什么想法吗?我错过了什么吗?任何帮助将非常感激...我快疯了:-( 谢谢。

最佳答案

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

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

编辑:play 2.3.X 尚不需要此解决方法。该宏运行良好。

关于json - 如何在 Play 2.1 中将案例类序列化到 Json 或从 Json 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15042205/

相关文章:

android - 将 JSON 转换为游标

java - 将 java hashmap 转换为 scala map

Scala 的类层次结构

scala - Scala中抽象类型参数的隐式转换

java - 当 bean 具有带有 @Formula 注释的属性时,findRowCount 不起作用

java - JQuery TokenInput 不显示搜索结果

asp.net - 仅在成功验证后才将 ajax 表单发送到 Web 服务

Java: JSONObject.toString() - 在冒号 (":"-> ": "之后添加额外的空间)

c# - Newtonsoft.JSON 无法转换具有 TypeConverter 属性的模型

scala - 如何以功能方式验证参数?