Scala将单词保留为JSON字段名称,使用Json.writes [A](等效于@SerializedName)

时间:2015-12-01 10:08:47

标签: json scala playframework playframework-2.0

我正在使用Play 2.4.3&amp ;; Scala采用以下方式,提供使用Writes[DeviceJson]创建的隐式Json.writes

import play.api.libs.json.Json

case class DeviceJson(name: String, serial: Long, type: String)

object DeviceJson {
  implicit val writes = Json.writes[DeviceJson]
}

当然,上面的代码没有编译,因为我试图在案例类中使用保留字type作为字段名。

在这种情况下,最简单输出JSON字段名称的方式是什么,例如typematch我不能用作Scala字段名称?

例如,使用Java和Gson,使用自定义JSON字段名称(与代码中的字段名称不同)对于@SerializedName注释来说将是微不足道的。同样在杰克逊@JsonProperty

我知道我可以通过滚动自己的Writes实现来完成此任务:

case class DeviceJson(name: String, serial: Long, deviceType: String)

object DeviceJson {
  implicit val writes = new Writes[DeviceJson] {
    def writes(json: DeviceJson) = {
      Json.obj(
        "name" -> json.name,
        "serial" -> json.serial,
        "type" -> json.deviceType
      )
    }
  }
}

但这是笨拙和重复的,特别是如果班级有很多领域。有更简单的方法吗?

1 个答案:

答案 0 :(得分:13)

在您的案例类中,您可以使用反引号作为字段名称:

case class DeviceJson(name: String, serial: Long, `type`: String)

这样,您的Writes应该可以正常工作