我如何解决 json4s 错误,以便 Option[Seq[_]] 将反序列化为 None 而不是 Some(List())
How do I workaround a json4s bug so that an Option[Seq[_]] will deserialize into a None instead of Some(List())
我目前正在使用 json4s 3.2.10。我意识到 json4s 是错误的,不应该用于任何事情,但这是一个遗留的代码库,目前关闭 json 解析器是不切实际的。
我遇到这样一种情况,其中 json 不存在的字段(并且是可选数组)被反序列化为 类,其中 Option[Seq[SomeClass]]
作为 Some(List())
而不是None
。这是 Json4s 中一个已知的主要错误,将近两年仍未解决:
https://github.com/json4s/json4s/issues/198
其他错误评论提到了自定义解决方法,但没有详细说明。我正在尝试编写一个客户解串器来处理这个问题,但我对语法和我应该做什么感到有点困惑。我从以下内容开始:
import org.json4s.{Formats, Serializer, TypeInfo, _}
class JsonSequenceOption[A] extends Serializer[Option[Seq[A]]] {
val Class = classOf[Option[Seq[A]]]
override def deserialize(implicit format: Formats) = {
case (TypeInfo(Class, _), seqJson) => {
//???
}
}
override def serialize(implicit format: Formats) = {
case (seq : Option[Seq[A]]) => seq match {
case Some(a : Seq[A]) => JArray(a.map(x => JString(x.toString)).toList)
case None => JNothing
}
}
}
..但我不确定 ???
附近到底该做什么。我什至走在正确的道路上吗?有没有更直接的解决方案?
我发现我不需要自定义序列化程序。由于此项目使用自定义编组器,因此一个简单的解决方案是将 extractOpt[A]
替换为 extract[Seq[Option[A]]]
。
变化:
(someobject \ "someField").extractOpt[Seq[String]]
收件人:
(someobject \ "someField").extract[Option[Seq[String]]]
我目前正在使用 json4s 3.2.10。我意识到 json4s 是错误的,不应该用于任何事情,但这是一个遗留的代码库,目前关闭 json 解析器是不切实际的。
我遇到这样一种情况,其中 json 不存在的字段(并且是可选数组)被反序列化为 类,其中 Option[Seq[SomeClass]]
作为 Some(List())
而不是None
。这是 Json4s 中一个已知的主要错误,将近两年仍未解决:
https://github.com/json4s/json4s/issues/198
其他错误评论提到了自定义解决方法,但没有详细说明。我正在尝试编写一个客户解串器来处理这个问题,但我对语法和我应该做什么感到有点困惑。我从以下内容开始:
import org.json4s.{Formats, Serializer, TypeInfo, _}
class JsonSequenceOption[A] extends Serializer[Option[Seq[A]]] {
val Class = classOf[Option[Seq[A]]]
override def deserialize(implicit format: Formats) = {
case (TypeInfo(Class, _), seqJson) => {
//???
}
}
override def serialize(implicit format: Formats) = {
case (seq : Option[Seq[A]]) => seq match {
case Some(a : Seq[A]) => JArray(a.map(x => JString(x.toString)).toList)
case None => JNothing
}
}
}
..但我不确定 ???
附近到底该做什么。我什至走在正确的道路上吗?有没有更直接的解决方案?
我发现我不需要自定义序列化程序。由于此项目使用自定义编组器,因此一个简单的解决方案是将 extractOpt[A]
替换为 extract[Seq[Option[A]]]
。
变化:
(someobject \ "someField").extractOpt[Seq[String]]
收件人:
(someobject \ "someField").extract[Option[Seq[String]]]