反序列化多态列表的复杂JSON

时间:2015-10-15 17:04:58

标签: json scala json4s

我有一个如下所示的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类型。

完成此任务的过程是什么?

任何提示都很棒。

谢谢!

1 个答案:

答案 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)
// )