JSON 单个 属性 案例的格式 类

JSON format for Single property case classes

给出

case class Location(lat: Double, long: Double)
case class Resident(location: Location)

Resident

编写 JSON 格式化程序的最简单方法是什么

我正在尝试使用 FunctionalBuilder

val residentFormats: Format[Resident] = (
(JsPath \ "location").format[Location]
) (Resident.apply, unlift(Resident.unapply))

但事实证明,将其与单个 属性 案例 class 一起使用并不容易。我随后的尝试往往涉及比我认为必要的代码更多的代码。

希望得到一些指点

只需使用:

object Resident {
  implicit val format: OFormat[Resident] = Json.format[Resident]
}

或者您可以拆分定义:

object Resident {
  implicit val reads: Reads[Resident] = Json.reads[Resident]
  implicit val writes: OWrites[Resident] = Json.writes[Resident]
}

可以定义reads,自己写:

object Resident {
  implicit val reads: Reads[Resident] = json => {
    (json \ "location").validate[Location].map(Resident(_))
  }
  implicit val writes: OWrites[Resident] = resident => Json.obj("localtion" -> resident.location)
}

注意:如果需要将名称从驼峰式转换为underscore_keys, 你可以定义隐式 JsonConfiguration:

object Resident {
  implicit val jsonConfig = JsonConfiguration(SnakeCase)
  implicit val format: OFormat[Resident] = Json.format[Resident]
}