我目前在json4s 3.2.10。我意识到json4s有很多bug,不应该用于任何事情,但这是一个遗留代码库,切换出json解析器目前是不切实际的。
我有一个不存在的json字段(并且是可选数组)被反序列化为具有Option[Seq[SomeClass]]
作为Some(List())
而不是None
的类。这是Json4s中一个已知的主要bug,在近两年的时间里都没有得到解决:
其他bug注释提到了定制的解决方法,但没有详细说明。我试图编写一个客户反序列化器来处理这个问题,但是我对语法和我应该做的事情有点困惑。我从下面开始:
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]]]