2015-02-20 11 views
5

Sto usando Play! Scala 2.2 e ho un problema di rendere un class in Json:Riproduci Scala: json writer per classi nidificate

Ho due classi con una seconda dell'altro, come segue:

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

E loro scrittori implicite:

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

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

Gli scrittori funzionano bene come segue:

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

se lo Artist ha un vuotolist of tracks. Ma se io voglio fare questo:

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

ottengo una execution exception: [NullPointerException: null]

Si può spiegare a me quello che sto facendo male? Grazie;)

risposta

4

Il problema è l'ordine di inizializzazione. Json.writes[Artist] richiede un numero implicito Writes[Track] per generare se stesso. Il compilatore è in grado di trovare l'implicito Writes[Track], perché si sta dichiarandolo nello stesso oggetto, tuttaviatrackWrites viene inizializzato dopoartistWrites, il che significa che quando si chiama Json.writes[Artist], trackWrites è null. Questo non interrompe la creazione di artistWrites, tuttavia, quindi passa inosservato fino a quando non viene effettivamente utilizzato.

È possibile risolvere questo problema semplicemente passando l'ordine di inizializzazione, in modo che trackWrites sia il primo.

+0

Non lo sapevo! Grazie;) – Simon

+0

È facile cadere in questa trappola perché il compilatore non emette alcun avviso a riguardo. Probabilmente il 99% degli NPE che ottengo in Scala si verificano dai problemi di ordine di inizializzazione. –

Problemi correlati