如何解决json4s错误,以便Option [Seq [_]]反序列化为None而不是Some(List())

时间:2016-11-09 22:04:11

标签: json scala serialization json4s

我目前在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
    }
  }
}

..但我不确定在???附近应该做些什么。我甚至走在正确的道路上?有更直接的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我发现我不需要自定义序列化程序。由于此项目使用自定义编组程序,因此一个简单的解决方案是将extractOpt[A]替换为extract[Seq[Option[A]]]

变化:

(someobject \ "someField").extractOpt[Seq[String]]

要:

(someobject \ "someField").extract[Option[Seq[String]]]