2015-10-07 25 views
0

我有一个非常复杂的JSON文件看起来像这样:转换(非常)复杂的JSON对象Scala的对象用case类在Json4s

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

我试图分析这个结构在某种程度上得到阶对象了的。

这里是我的尝试:

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

这当然,不能将数据转换。它返回一个JNothing。我想知道如何在JArrays中正确表达复杂的JArrays。

任何帮助将有用

谢谢!

回答

2

您可以为FactsAnimalType定义CustomSerializer

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")})) 

如果你把你输入JSON作为json你可以用反序列化值:

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)) 
// )) 
//)) 
+0

这是完美的!非常感谢! – nietsnegttiw