0

我可以在方法中将自定义类型作为参数传递并使用它从外部 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 响应之前,不会实例化该类。

4

1 回答 1

0

我想我理解您的问题,否则请告诉我: Play 无法自动映射InfoReads,因为它缺少其中一种属性类型的 Json 转换器SunInfoResults

Play JSON API 为大多数基本类型(int、boolean)提供隐式读/写。要将您自己的模型与 JsValues 相互转换,您必须定义隐式读取和写入转换器并在范围内提供它们。因此,如果您将自动转换用于SunInfo

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

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

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

如果我不需要定义任何自定义读取/写入或添加验证,我通常会在案例类的伴随对象中使用格式化程序,它会自动导入到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]
}
于 2017-06-26T17:24:55.597 回答