Ich habe eine sehr komplizierte JSON-Datei, die folgendermaßen aussieht:
{
"Animals": [
[
100,
"Mammals",
[
1,
"Cat",
50,
45,
57,
-1
],
[
2,
"Dog",
31,
44,
18,
-1
]
],
[
159,
"Reptiles",
[
1,
"Lizard",
11,
12,
9,
-1
]
]
]
}
Ich versuche, diese Struktur zu analysieren und irgendwie Scala-Objekte herauszuholen.
Hier war mein Versuch:
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])
Dies kann natürlich die Daten nicht konvertieren. Es gibt ein JNothing zurück. Ich frage mich, wie ich komplexe JArrays in JArrays dieser Art richtig ausdrücken kann.
Jede Hilfe wäre nützlich
Vielen Dank!
Antworten:
2 für die Antwort № 1Sie können definieren CustomSerializer
s für Facts
und 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")}))
Wenn Sie Ihre Eingabe json als Wert nehmen json
Sie können es deserialisieren mit:
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))
// ))
// ))