我有一个如下所示的JSON文件:
{
"Animals": [
[
543,
"Mammals",
[
1,
"Cat",
22,
45,
18
],
[
2,
"Dog",
45,
13,
27
]
]
]
}
这包含一个键 - Animals - 其余的是一个表示为int,string和多态列表列表的列表的值。
在尝试解析我的数据结构时,我使用了case类:
sealed abstract class subTypes
case class typeOfAnimal(possSubType: String) extends subTypes
case class animalTraits(trait: Int) extends subTypes
case class animalResults(id: Int, type: String, results: List[List[subTypes]])
case class Animals(rows: List[List[animalResults]])
这失败了。解析这样一个复杂结构的最简单方法是什么,从JSON反序列化为scala类型。
完成此任务的过程是什么?
任何提示都很棒。
谢谢!
答案 0 :(得分:2)
我们可以为CustomSerializer
创建SubType
,以便您可以处理多态列表。其余应与your previous question类似。
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.native.JsonMethods._
import org.json4s.native.Serialization
sealed trait SubType
case class TypeOfAnimal(possSubType: String) extends SubType
case class AnimalTrait(`trait`: Int) extends SubType
object SubTypeSerializer extends CustomSerializer[SubType](format => ( {
case JString(subType) => TypeOfAnimal(subType)
case JInt(animalTrait) => AnimalTrait(animalTrait.toInt)
}, {
case TypeOfAnimal(st) => JString(st)
case AnimalTrait(tr) => JInt(tr)
}
))
您可以将其用作:
implicit val formats = Serialization.formats(NoTypeHints) + SubTypeSerializer
val json = """[2, "Dog", 45, 13, 27]"""
parse(json).extract[List[SubType]]
// List[SubType] = List(
// AnimalTrait(2), TypeOfAnimal(Dog), AnimalTrait(45),
// AnimalTrait(13), AnimalTrait(27)
// )