【发布时间】:2019-01-18 10:08:47
【问题描述】:
使用过的游戏框架我有 案例类 文件(在项目中有聚合任务。这很重要),例如
case class Project (var tasks: Map[String, Task])
case class Task (var activities: Map[String, String])
在另一个文件trait中进行转换
trait JsonConverters {
implicit val projectWrite: OWrites[Project] = Json.writes[Project]
implicit val projectRead: Reads[Project] = Json.reads[Project]
implicit val taskWrite: OWrites[Task] = Json.writes[Task]
implicit val taskRead: Reads[Task] = Json.reads[Task]
}
object JsonConverters extends JsonConverters
在我的服务类中
import support.JsonConverters._
class Service {
def someMethod(json: String) = {
val obj = Json.parse(json).as[Map[String, Project]]
}
}
在编译时一切正常。但是在 json 解析中,我在 json 库中得到了 NPE
(play.api.libs.json.DefaultReads#mapReads)
implicit def mapReads[K, V](k: String => JsResult[K])(implicit fmtv: Reads[V]): Reads[Map[K, V]] = Reads[Map[K, V]] {
implicit fmtv: Reads[V] is null 用于 Task 类(对于 Project 来说一切正常)
我认为这是因为在.as[Map[String, Project] 中仅指定了 Project 类,而不是 Task。但不完全是
我为这个问题找到了 2 个不同的解决方案,但对我来说都很难看
1) 在 same 文件中用案例类声明所有隐式转换器。但我想将所有转换器放在单独的文件中。这个解决方案不适合我
2) 在trait JsonConverters
trait JsonConverter {
implicit val projectWrite: OWrites[Project] = Json.writes[Project]
implicit val projectRead: Reads[Project] = Json.reads[Project]
implicit lazy val taskWrite: OWrites[Task] = Json.writes[Task]
implicit lazy val taskRead: Reads[Task] = Json.reads[Task]
}
它工作正常,看起来不错。但是我不明白为什么没有 lazy 在 separate trait 中不起作用?谁能描述一下?或建议其他解决方案
【问题讨论】:
-
不同文件不保证初始化顺序
标签: json scala playframework