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 № 1Vous pouvez définir CustomSerializer
s 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))
// ))
// ))