我正在将一个json反序列化为scala中的一个类。如果类有一个json中不存在的成员,我希望它能获得在主构造函数中指定的默认值,但事实并非如此。
在下面的示例中,如何将prop 2变为空字符串(现在它为null)。
import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
case class Thing(var prop1 : String = "",
var prop2 : String = "",
var prop3 : String = "")
object test {
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
def main(args: Array[String]): Unit = {
val thingStr = """{"prop1":"val1","prop3":"val3"}"""
val thing = mapper.readValue[Thing](thingStr)
System.out.println(thing)
}
}
上面的代码打印出来
Thing(val1,null,val3)
我怎样才能让prop2成为一个空字符串?
最后我按照Diego的建议编写了一个自定义反序列化程序。
import com.fasterxml.jackson.core.{Version, JsonParser, JsonGenerator}
import com.fasterxml.jackson.databind._
import com.fasterxml.jackson.databind.module.SimpleModule
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
case class Thing(var prop1 : String = "",
var prop2 : String = "",
var prop3 : String = "")
object test {
val module = new SimpleModule("CustomJson", Version.unknownVersion())
module.addDeserializer(classOf[Thing], new ThingDeserializer)
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
mapper.registerModule(module)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
def main(args: Array[String]): Unit = {
val thingStr = """{"prop1":"val1","prop3":"val3"}"""
val thing = mapper.readValue[Thing](thingStr)
System.out.println(thing)
}
}
class ThingDeserializer extends JsonDeserializer[Thing] {
def deserialize(jp: JsonParser, context: DeserializationContext) = {
val node : JsonNode = jp.getCodec().readTree(jp);
System.out.println(node)
new Thing(prop1 = if (node.has("prop1")) node.get("prop1").toString else "",
prop2 = if (node.has("prop2")) node.get("prop2").toString else "",
prop3 = if (node.has("prop3")) node.get("prop3").toString else "")
}
}