5

私はプレイを使用しています!classScala 2.2 と私はinをレンダリングするのに問題がありますJson:

次のように、一方が他方に依存する2つのクラスがあります。

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] )

そしてそれらの暗黙の Writers :

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]

私が間違っていることを説明してもらえますか?

4

2 に答える 2

5

問題は初期化の順序です。自身を生成するにJson.writes[Artist]は暗黙的が必要です。同じオブジェクトで宣言しているためWrites[Track]、コンパイラは暗黙の を見つけることができますが、はのに初期化されます。つまり、が呼び出されたときはです。ただし、これによって の作成が中断されることはないため、実際に使用されるまで気付かれません。Writes[Track] trackWrites artistWritesJson.writes[Artist]trackWritesnullartistWrites

これは、初期化の順序を変更するだけで修正できるので、それtrackWritesが最初です。

于 2015-02-20T02:01:30.997 に答える