【问题标题】:JSON4S not able to deserialize objectJSON4S 无法反序列化对象
【发布时间】:2023-06-21 00:51:01
【问题描述】:

我有一个类扩展了如下所示的特征:

case class Phone(number: String)

trait Person {
  def name: String
  def phones: Seq[Phone]
}

case class Employee(name: String, phones: Seq[Phone] = Seq.empty) extends Person

如上所示,Employee 类扩展了Person trait。

我正在尝试序列化然后反序列化一个Employee 类型的对象,如下所示:

implicit val formats = DefaultFormats

val emp: Person = Employee("foo")
val c = write(emp)
val e2 = parse(c).extract[Person]

对象emp 被正确序列化

emp: Person = Employee(foo,List())
c: String = {"name":"foo","phones":[]}

parse(c).extract[Person] 方法失败并出现以下异常:

org.json4s.package$MappingException: No constructor for type Person, 
JObject(List((name,JString(foo)), (phones,JArray(List()))))

我尝试像下面一样添加FieldSerializer,但遇到了同样的异常。

implicit val formats = DefaultFormats + FieldSerializer[Employee with Person]()

所以我开始编写如下所示的自定义序列化程序:

case object PersonSerializer extends CustomSerializer[Person](formats => (
  {
    case JObject(
      List(
        JField("name", JString(name)),
        JField("phones", JArray(List(phones)) )
      )
    ) => Employee(name, phones)
  },
  {
    case Employee(name, phones) => JObject(JField("name", JString(name)))
  }
))

但此序列化程序无法编译并出现以下错误:

type mismatch;
found   : org.json4s.JsonAST.JValue
required: Seq[Phone]
) => Employee(name, phones)

那么您能帮我编写自定义序列化程序还是将JValue 转换为Seq[Phone]

【问题讨论】:

    标签: json scala json-deserialization json4s


    【解决方案1】:

    我不认为您的实际问题是您认为的问题-您无法提取 Person,这是一个特征!相反,我会提取一个员工;如果您需要将其作为 Person,只需在提取后将其转换为 Person。

    【讨论】: