[英]JSON arrays and Scala Seq
我有類似class A(b:Seq[String])
scala類class A(b:Seq[String])
我的問題是當我從沒有b
字段的文本反序列化它時我的類包含null
。 有可能強制deserealizer填充空Seq
?
我使用com.fasterxml.jackson.databind.ObjectMapper
和com.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.