簡體   English   中英

JSON數組和Scala Seq

[英]JSON arrays and Scala Seq

我有類似class A(b:Seq[String]) scala類class A(b:Seq[String])

我的問題是當我從沒有b字段的文本反序列化它時我的類包含null 有可能強制deserealizer填充空Seq

我使用com.fasterxml.jackson.databind.ObjectMappercom.fasterxml.jackson.module.scala.DefaultScalaModule

編輯:我想要解決所有這些字段的解決方案,而無需明確提及它們的完整列表。 Ir改變所有聲明。

不幸的是,傑克遜目前不支持此功能。

您可以在此處查看相關的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

如果您使用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

我有一個類似的問題用jackson反序列化String數組,並發現jackson顯然(尚未嘗試)在jackson-module 2.1.2中修復它。 它可能適用於Seq。 https://github.com/FasterXML/jackson-module-scala/issues/48

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM