【问题标题】:deserializing json4s with generic type反序列化具有泛型类型的 json4s
【发布时间】:2020-11-19 15:41:16
【问题描述】:

更新:仔细查看我的其余代码,我在其他地方遇到了问题,这就是它无法正常工作的原因。谢谢

我想知道是否可以使用 json4 序列化程序来反序列化和使用泛型的对象。

我的 json 数据具有相似的特征,但某一部分的信息不同

例如,我有超级英雄,谁的技能不同

*Json 数据

{
  "type": "Blue",
  "name": "Aquaman",
  "age": "4",
  "skills": {
    "Cooking": 9,
    "Swimming": 4
  }
}
{
  "type": "Red",
  "name": "Flash",
  "age": "8",
  "skills": {
    "Speed": 9,
    "Punctual": 10
  }
}

所以我想做的是

case class Superhero[T](
  `type`: String,
  name: String,
  age: Int,
  skills: T
)

以及相应的技能案例类别

case class BlueSkill(
  Cooking: Int,
  Swimming: Int
)
case class RedSkill(
  Speed: Int,
  Punctual: Int
)

但是当我阅读并尝试将其映射到另一个对象时,我在数据框中得到null

val bluePerson = read[Superhero[BlueSkill]](jsonBody)

所以想知道json4是否可以读取通用对象。

【问题讨论】:

标签: json scala json4s


【解决方案1】:

当然可以,为什么它的工作方式与非泛型类型有任何不同?

import org.json4s.native.{Serialization => S}
import org.json4s.DefaultFormats
implicit val fmts = DefaultFormats
  S.read[Superhero[RedSkill]]("""|{
                                 |  "type": "Red",
                                 |  "name": "Flash",
                                 |  "age": 8,
                                 |  "skills": {
                                 |    "Speed": 9,
                                 |    "Punctual": 10
                                 |  }
                                 |}""".stripMargin)


但坦率地说,我会远离 json4s 或任何其他自省废话,而是使用基于类型类的库,例如 circe。

【讨论】:

    最近更新 更多