/ / Conversion d'objets (très) compliqués JSON en objets Scala avec classes de cas dans Json4s

Conversion d'objets (très) compliqués JSON en objets Scala avec des classes de cas dans Json4s - json, scala, case-class, json4s

J'ai un fichier JSON très compliqué qui ressemble à ceci:

       {
"Animals": [
[
100,
"Mammals",
[
1,
"Cat",
50,
45,
57,
-1
],
[
2,
"Dog",
31,
44,
18,
-1
]
],
[
159,
"Reptiles",
[
1,
"Lizard",
11,
12,
9,
-1
]
]
]
}

J'essaie d'analyser cette structure et d'en extraire des objets scala.

Voici ma tentative:

case class Facts(number: Int, subTypeOfAnimal: String, data: List[Int])

case class Animaltype(value: Int, typeOfAnimal: String, characteristics: List[Facts])

case class Animal(rows: List[Animaltype])

Ceci, bien sûr, ne parvient pas à convertir les données. Il retourne un rien. Je me demande comment je peux exprimer correctement des JArrays complexes au sein de JArrays de ce type.

Toute aide serait utile

Merci!

Réponses:

2 pour la réponse № 1

Vous pouvez définir CustomSerializers pour Facts et AnimalType.

import scala.util.Try

import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.native.JsonMethods._
import org.json4s.native.Serialization

case class Facts(number: Int, subTypeOfAnimal: String, data: List[Int])
case class AnimalType(value: Int, typeOfAnimal: String, characteristics: List[Facts])
case class Animal(Animals: List[AnimalType])

implicit val formats = Serialization.formats(NoTypeHints) +
new AnimalTypeSerializer + new FactsSerializer

class FactsSerializer extends CustomSerializer[Facts](format => ( {
case JArray(JInt(nr) :: JString(subType) :: data) =>
Facts(nr.toInt, subType, data.collect{ case JInt(i) => i.toInt})
}, { case _ => throw new RuntimeException("No serializing")}))

class AnimalTypeSerializer extends CustomSerializer[AnimalType](format => ( {
case JArray(JInt(value) :: JString(typeAnimal) :: factsArrays) =>
val facts = factsArrays.collect { case facts: JArray =>
Try(facts.extract[Facts]).toOption
}.flatten
AnimalType(value.toInt, typeAnimal, facts)
}, { case _ => throw new RuntimeException("No serializing")}))

Si vous prenez votre entrée json comme valeur json vous pouvez le désérialiser avec:

parse(json).extract[Animal]
// Animal = Animal(List(
//   AnimalType(100,Mammals,List(
//     Facts(1,Cat,List(50, 45, 57, -1)), Facts(2,Dog,List(31, 44, 18, -1))
//   )),
//   AnimalType(159,Reptiles,List(
//     Facts(1,Lizard,List(11, 12, 9, -1))
//   ))
// ))