我有像class A(b:Seq[String])
我的问题是当我从没有b
字段的文本中反序列化时,我的类包含null
。可以强制deserealizer填充空Seq
?
我将com.fasterxml.jackson.databind.ObjectMapper
与com.fasterxml.jackson.module.scala.DefaultScalaModule
一起使用。
修改 我想要解决所有这些字段的解决方案,而没有明确提及它们的完整列表。 Ir改变所有声明。
答案 0 :(得分:5)
不幸的是,杰克逊目前不支持。
您可以在此处查看相关的GitHub票证:https://github.com/FasterXML/jackson-databind/issues/347
最好的办法是将null
映射到类构造函数或访问器方法中的空Seq
:
class A(_b: Seq[String]) {
val b = _b match {
case null => Nil
case bs => bs
}
}
(另请参阅https://stackoverflow.com/a/20655330/8261了解其他选项)
答案 1 :(得分:1)
如果您使用Spray JSON,那么一个不处理b
字段缺失的简单示例如下所示:
import spray.json._
case class A(b: Seq[String])
object Protocol extends DefaultJsonProtocol {
implicit def aFormat = jsonFormat1(A)
}
import Protocol._
val str1 = """{ "b" : [] }""""
val str2 = """{ "b" : ["a", "b", "c"] }""""
val str3 = """{}"""
str1.parseJson.convertTo[A]//successful
str2.parseJson.convertTo[A]//successful
str3.parseJson.convertTo[A]//Deserialization error
在Spray JSON中,可以通过为A类编写更详细的协议格式来解决这个问题:
import spray.json._
case class A(b: Seq[String])
object Protocol extends DefaultJsonProtocol {
implicit object aFormat extends RootJsonFormat[A] {
override def write(obj: A): JsValue = JsObject("b" -> obj.b.toJson)
override def read(json: JsValue): A = json match {
//Case where the object has exactly one member, 'b'
case JsObject(map) if map.contains("b") && map.size == 1 => A(map("b").convertTo[Seq[String]])
//Case where the object has no members
case JsObject(map) if map.isEmpty => A(Seq())
//Any other json value, which cannot be converted to an instance of A
case _ => deserializationError("Malformed")
}
}
}
import Protocol._
val str1 = """{ "b" : [] }""""
val str2 = """{ "b" : ["a", "b", "c"] }""""
val str3 = """{}"""
str1.parseJson.convertTo[A]//successful
str2.parseJson.convertTo[A]//successful
str3.parseJson.convertTo[A]//successful
答案 2 :(得分:0)
我有一个类似的问题用jackson反序列化String数组,发现jackson显然(还没有尝试过)在jackson-module 2.1.2中修复它。它可能适用于Seq。 https://github.com/FasterXML/jackson-module-scala/issues/48