多态列表的反序列化复杂 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)
// )
我有一个 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)
// )