2017-07-21 2 views
0

En guise de mise en garde: Je suis très novice dans la programmation Scala et fonctionnelle en général.Analyse d'une séquence d'objets avec la bibliothèque Play-JSON

Je les classes suivantes:

case class A(
    field1: String, 
    field2: DateTime 
) 

case class B(
    listOfStuff: Seq[A] 
) 

object A{ 
    def create(field1: String, field2: DateTime): A = A(field1, field2) 
} 

object B{ 
    def create(listOfStuff: Seq[A]): B = B(listOfStuff) 
} 

(.. Les create() fonctions existent parce que je parfois eu des problèmes dans mon code lors de l'utilisation apply() Ignorons, je doute qu'il est pertinent)

Je reçois ces objets au format JSON et j'essaye de les analyser en utilisant la bibliothèque Play-JSON. Un aspect important est que la liste (Seq) peut être manquante dans le texte JSON, c'est un champ optionnel.

Dans cet esprit, voici comment je l'ai écrit cette ligne particulière:

private implicit val messageReader = (
    //... 
    (__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq())) 
    //... 
)(B.create _) 

Lors de la compilation, je reçois l'erreur suivante:

Error:(!line!, !column!) No Json deserializer found for type Seq[A]. Try to implement an implicit Reads or Format for this type.

D'après ce que j'ai vu dans this question, apparemment vous besoin d'avoir une implicit instance de Reads[T] pour chaque type qui ne fait pas partie de la langue (ou quelque chose comme ça, ai-je mentionné que je suis nouveau à cela?)

donc j'ai aussi ajouté un Reads[T] secondaire dans le même champ, mon code maintenant ressemblait à ceci:

private implicit val messageReader = (
    (__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq())) 
)(B.create _) 

private implicit val anotherReader = (
    (__ \ "field1").read[String] and 
    (__ \ "field2").read[String].map(org.joda.time.DateTime.parse) 
)(A.create _) 

Cependant, je reçois toujours la même erreur sur la même ligne. Je me sens comme il y a un problème très facile et évident ici, mais je ne peux pas comprendre ce que c'est.

Comment résoudre ce problème?

+0

Pour pouvoir utiliser parseurs de 'Seq [T]', 'parseurs pour T' doivent être disponibles – cchantep

+0

@cchantep qui C'est pourquoi j'ai ajouté le 'private implicit val anotherReader'. Ça ne marche toujours pas. –

+0

Il doit être disponible * avant * (pas comme un val plus tard) – cchantep

Répondre

0

si B.create accepte un seul argument alors son lit peut ressembler à ceci:

private implicit val messageReader : Reads[B] = 
    (__ \ "stuff").readNullable[Seq[A]].map(_.getOrElse(Seq())).map(B.create) 
+0

En fait, ils sont environ 20 champs là-bas, mais bien sûr, je les ai supprimés dans le but de cette question. –