JSON4S 无法反序列化对象
JSON4S not able to deserialize object
我有一个 class 扩展了一个特征,如下所示:
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
class extends 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]
吗?
我不认为你的实际问题是你认为的那个——你不能提取一个人,这是一种特征!相反,我会提取一个 Employee ;如果你需要它是一个人,在提取后将它转换为一个人。
我有一个 class 扩展了一个特征,如下所示:
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
class extends 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]
吗?
我不认为你的实际问题是你认为的那个——你不能提取一个人,这是一种特征!相反,我会提取一个 Employee ;如果你需要它是一个人,在提取后将它转换为一个人。