播放Scala:嵌套类的json编写器

时间:2015-02-20 01:43:53

标签: json scala playframework-2.2 playframework-json

我正在玩Play! Scala 2.2和我在class中呈现Json时遇到问题:

我有两个类,其中一个依赖于另一个,如下所示:

case class Artist(id: String, cover: String, website: List[String], link: String, Tracks: List[Track] = List())

case class Track(stream_url: String, title: String, artwork_url: Option[String] )

他们隐含的作家:

implicit val artistWrites: Writes[Artist] = Json.writes[Artist]

implicit val trackWrites: Writes[Track] = Json.writes[Track]

作家的工作如下:

println(Json.toJson(Track("aaa", "aaa", Some("aaa"))))
println(Json.toJson(Artist("aaa", "aaa", List("aaa"), "aaa", List())))

Artist list of tracks。 但如果我想这样做:

println(Json.toJson(Artist("aaa", "aaa", List("aaa"), "aaa", List(SoundCloudTrack("ljkjk", "ljklkj", Some("lkjljk"))))))

我得到execution exception[NullPointerException: null]

你能解释一下我做错了什么吗?谢谢;)

2 个答案:

答案 0 :(得分:5)

问题是初始化顺序。 Json.writes[Artist]需要隐式Writes[Track]才能生成自己。编译器能够找到隐式Writes[Track],因为您在同一个对象中声明它,然而 trackWrites在之后被初始化 artistWrites,表示调用Json.writes[Artist]时,trackWritesnull。但是,这并不会中断artistWrites的创建,因此在实际使用之前不会引起注意。

您可以通过简单地切换初始化顺序来解决此问题,以便trackWrites成为第一个。

答案 1 :(得分:0)

使用Play 2.8确实很简单,以下对我有用的作品:

假设我上了三节课:

case class InnerBean(fieldName: String, status: String, ruleCode: Int, subRuleCode: List[Int])

case class IntermediateBean(itemId: Long, innerBeanData: Option[List[InnerBean]])

case class OuterBean(uniqueTrackingId: String, intermediateBeanData: List[IntermediateBean])

implicit val innerBeanWrites: Writes[InnerBean] = Json.writes[InnerBean]
implicit val intermediateBeanWrites: Writes[IntermediateBean] = Json.writes[IntermediateBean]
implicit val outerBeanWrites: Writes[OuterBean] = Json.writes[OuterBean]