使用自定义类型参数自动映射 JSON 响应



我可以将自定义类型作为方法中的参数传递并使用它来从外部 API读取 JSON吗?所以如果我有这个:

trait ApiInfo
case class SunInfoResults(sunrise: String, sunset: String, solar_noon: String, day_length: Long, civil_twilight_begin: String, civil_twilight_end: String, nautical_twilight_begin: String, nautical_twilight_end: String, astronomical_twilight_begin: String, astronomical_twilight_end: String)
case class SunInfo(results: SunInfoResults, status: String) extends ApiInfo
case class TvInfo(url: String, name: String, gender: String, culture: String, born: String, died: String, titles: Array[String], aliases: Array[String], father: String, mother: String, spouse: String, allegiances: Array[String], books: Array[String], povBooks: Array[String], tvSeries: Array[String], playedBy: Array[String]) extends ApiInfo

在对外部 API 进行服务调用之前,我需要声明一个隐式序列化 JSON。那么我将如何指定需要映射到的类(在Play 2.5中使用JSON自动映射)?我确信这必须是可能的,因为 Scala 建立在减少重复代码的概念之上——否则如果没有这样的解决方案,我将不得不这样做。这是我在将任何自定义类型传递到时遇到麻烦的行:

implicit val infoReads = Json.reads[p] // where p is SunInfo or TvInfo

只是在对类型主题进行一些研究之后也包括在内;我想知道我是否必须使用幻像类型,因为该类在正确映射到 JSON 响应之前不会实例化。

我想我理解你的问题,否则让我知道:Play 无法自动映射InfoReads因为它缺少其属性类型之一的 Json 转换器SunInfoResults

Play JSON API 为大多数基本类型(整数、布尔值)提供隐式读/写。若要将自己的模型与 JsValues 相互转换,必须定义隐式读取和写入转换器,并在作用域中提供它们。因此,如果您使用自动转换SunInfo

implicit val sunInfoReads: Reads[SunInfo] = Json.reads[SunInfo]

只要您为范围内的自定义数据类型定义了隐式Reads,Play 就可以读取属性results: SunInfoResultsSunInfoResults

implicit val sunInfoResultsReads: Reads[SunInfoResults] = Json.reads[SunInfoResults]

如果我不需要定义任何自定义读/写或添加验证,我通常只会在 case 类的伴随对象中使用格式化程序,该对象将自动导入到使用SunInfoResult的作用域中:

case class SunInfoResults(sunrise: String, sunset: String, solar_noon: String, day_length: Long, civil_twilight_begin: String, civil_twilight_end: String, nautical_twilight_begin: String, nautical_twilight_end: String, astronomical_twilight_begin: String, astronomical_twilight_end: String)
object SunInfoResults {
implicit val sunInfoResultsFormat = Json.format[SunInfoResults]
}

最新更新