Pertanyaan Mainkan Scala: penulis json untuk kelas bertingkat


Saya menggunakan Play! Scala 2.2 dan saya punya masalah untuk membuat a class di Json :

Saya memiliki dua kelas dengan satu tergantung yang lain, sebagai berikut:

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

Dan Penulis implisit mereka:

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

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

Para penulis bekerja dengan baik sebagai berikut:

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

yaitu jika Artist punya kosong  list of tracks. Tetapi jika saya ingin melakukan ini:

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

Saya mendapatkan execution exception : [NullPointerException: null] 

Bisakah Anda jelaskan apa yang saya lakukan salah? Terima kasih;)


5
2018-02-20 01:43


asal


Jawaban:


Masalahnya adalah urutan inisialisasi. Json.writes[Artist] membutuhkan implisit Writes[Track] untuk menghasilkan dirinya sendiri. Compiler dapat menemukan implisit Writes[Track], karena Anda mendeklarasikannya dalam objek yang sama, namun  trackWrites diinisialisasi setelah  artistWrites, yang berarti kapan Json.writes[Artist] disebut, trackWrites aku s null. Ini tidak mengganggu pembuatan artistWrites, bagaimanapun, sehingga tidak diketahui sampai benar-benar digunakan.

Anda dapat memperbaikinya dengan hanya mengubah urutan inisialisasi, sehingga trackWrites adalah yang pertama.


5
2018-02-20 02:01