JSON数组和Scala Seq

时间:2015-09-25 16:06:18

标签: json scala deserialization

我有像class A(b:Seq[String])

这样的scala类

我的问题是当我从没有b字段的文本中反序列化时,我的类包含null。可以强制deserealizer填充空Seq

我将com.fasterxml.jackson.databind.ObjectMappercom.fasterxml.jackson.module.scala.DefaultScalaModule一起使用。

修改 我想要解决所有这些字段的解决方案,而没有明确提及它们的完整列表。 Ir改变所有声明。

3 个答案:

答案 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