JSON格式是否足以解析具有>的案例类22个领域?

时间:2017-03-09 10:56:24

标签: json scala playframework

我的案例类有30个字段。为简单起见,我使用了4个字段,

case class Person(id: Long, name: String, age: Int, sex: Sex)

val personFormat1: OFormat[(Long, String)] = ((__ \ "id").format[Long] ~ (__ \ "name").format[String]).tupled
val personFormat2: OFormat[(Int, Sex)] = ((__ \ "age").format[Int] ~ (__ \ "sex").format[Sex]).tupled
implicit val personFormat: Format[Person] = (personFormat1 ~ personFormat2)({
  case ((id, name), (age, sex)) => new Person(id, name, age, sex)
}, (person: Format) => ((person.id, person.name), (person.age, person.sex)))

但即使将format1作为一组22个字段并且format2作为一组8个字段编写格式化程序,我在尝试解析此案例类的json时会出错。

错误是 没有找到类型为Person的JsObject的Json序列化程序。尝试为此类型实现隐式OWrites或OFormat。

如何写隐式的Owrites或OFormat?或者如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我使用 Play-Json扩展程序库来处理超过22个字段的JSON:https://github.com/xdotai/play-json-extensions

libraryDependencies += "ai.x" %% "play-json-extensions" % "0.8.0"

答案 1 :(得分:0)

你需要一个隐含的作家才能做到这一点。像这样的东西

implicit val person= Json.format[Person]

此外,如果您使用的是自定义数据类型,例如性别,则需要指定读者和编写者。您不需要为Int,Long,String等原始类型执行此操作。

  def enumReads[T <: Enum[T]](mkEnum: String => T) = new Reads[T] {
    override def reads(json: JsValue): JsResult[T] =
      json match {
        case JsString(s) => try {
          JsSuccess(mkEnum(s))
        }
        catch {
          case e: IllegalArgumentException =>
            JsError("Not a valid enum value: " + s)
        }
        case v => JsError("Can't convert to enum: " + v)
      }
  }

  implicit val enumWrites = new Writes[Enum[_]] {
    def writes(e: Enum[_]) = JsString(e.toString)
  }

  implicit val sex = enumReads(Sex.valueOf)

此外,升级到scala 2.11或更高版本以避免在案例类中限制22个字段。有关详细信息,请参阅此处:How to get around the Scala case class limit of 22 fields?