Scala 保留字作为 JSON 字段名称与 Json.writes[A](播放等同于 @SerializedName)
Scala reserved word as JSON field name with Json.writes[A] (Play equivalent for @SerializedName)
我正在使用 Play 2.4.3 和 Scala 以下列方式生成 JSON,提供使用 Json.writes
.
创建的隐式 Writes[DeviceJson]
import play.api.libs.json.Json
case class DeviceJson(name: String, serial: Long, type: String)
object DeviceJson {
implicit val writes = Json.writes[DeviceJson]
}
当然,上面的代码无法编译,因为我正在尝试在 class.
的情况下使用保留字 type
作为字段名称
在这种情况下,什么是最简单的方法来输出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
)
}
}
}
但这很笨拙且重复,特别是如果 class 有很多字段。有没有更简单的方法?
在您的情况下 class,您可以对字段名称使用反引号:
case class DeviceJson(name: String, serial: Long, `type`: String)
有了这个,你的 Writes
应该可以工作了
我正在使用 Play 2.4.3 和 Scala 以下列方式生成 JSON,提供使用 Json.writes
.
Writes[DeviceJson]
import play.api.libs.json.Json
case class DeviceJson(name: String, serial: Long, type: String)
object DeviceJson {
implicit val writes = Json.writes[DeviceJson]
}
当然,上面的代码无法编译,因为我正在尝试在 class.
的情况下使用保留字type
作为字段名称
在这种情况下,什么是最简单的方法来输出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
)
}
}
}
但这很笨拙且重复,特别是如果 class 有很多字段。有没有更简单的方法?
在您的情况下 class,您可以对字段名称使用反引号:
case class DeviceJson(name: String, serial: Long, `type`: String)
有了这个,你的 Writes
应该可以工作了