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

Deserializing complex JSON of Polymorphic Lists

我有一个 JSON 文件,如下所示:

{
    "Animals": [
        [
            543,
            "Mammals",
            [
                1,
                "Cat",
                22,
                45,
                18
            ],
            [
                2,
                "Dog",
                45,
                13,
                27
            ]
        ]
    ]
}

这包含一个键 - Animals - 其余的是一个值,表示为 int 列表、字符串列表和多态列表列表的列表。

在尝试解析我的数据结构时,我使用了 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 类型。

完成这个的过程是什么?

任何提示都很棒。

谢谢!

我们可以为SubType创建一个CustomSerializer,这样你就可以处理多态列表了。其余的应该类似于.

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