我正在玩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]
你能解释一下我做错了什么吗?谢谢;)
答案 0 :(得分:5)
问题是初始化顺序。 Json.writes[Artist]
需要隐式Writes[Track]
才能生成自己。编译器能够找到隐式Writes[Track]
,因为您在同一个对象中声明它,然而 trackWrites
在之后被初始化 artistWrites
,表示调用Json.writes[Artist]
时,trackWrites
为null
。但是,这并不会中断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]