2015-09-25 70 views
4

我有斯卡拉類像class A(b:Seq[String])JSON陣列和Scala SEQ

我的問題是,當我從沒有b場我的類包含null文本反序列化。可以強制deserealizer填充空Seq?我使用com.fasterxml.jackson.databind.ObjectMappercom.fasterxml.jackson.module.scala.DefaultScalaModule

編輯: 我想解決方案,修復所有這些領域,沒有明確提及他們的完整列表。更改所有聲明。

+0

您是否願意使用其他JSON庫? – mattinbits

+0

是的。我可以使用替代庫。 – talex

回答

5

不幸的是,Jackson目前不支持這個功能。

你可以看到相關的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對於其他選項)

+0

該解決方案需要對每個「Seg [?]」類型的字段進行更改。我想在一個地方解決問題。 – talex

1

如果您使用Spray JSON,那麼不處理缺少b字段的簡單示例將看起來爲l IKE:

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 

在噴霧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 
+1

該解決方案需要明確指定'Seq [?]'類型的所有字段。我有很多這樣的人,希望他們都以這種方式行事。 – talex

+0

你能舉一個具體的例子嗎?它是許多案例類或一個類與seq類型的許多成員? – mattinbits

+0

都是。我有幾個案例類,每個都有多個「Seq」字段。 – talex