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

Jon*_*nik 5 json scala playframework playframework-2.0

我正在以下列方式使用Play 2.4.3和Scala生成JSON,提供隐式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]
}
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,输出JSON字段名称的最简单方法是什么,type或者match我不能用作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
      )
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

vde*_*gue 13

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

case class DeviceJson(name: String, serial: Long, `type`: String)
Run Code Online (Sandbox Code Playgroud)

有了这个,你Writes应该工作

  • 好的谢谢!我不得不查一查; 这些名称称为[文字标识符](http://stackoverflow.com/questions/6576594/need-clarification-on-scala-literal-identifiers-backticks). (2认同)