我正在使用 JSON4S,当相应对象的字段是一个选项时,它会正确处理缺少的字段。我正在使用
implicit val formats =
Serialization.formats(NoTypeHints) +
new org.json4s.ext.EnumNameSerializer(E)
和read[T](json)
.
这是完美的,除了一件事。我想在缺失字段和null
字段之间指定。对于我T
的每个领域,我希望有一个类似Triple
的东西,而不是Option
,其中这个三元组要么是Some(t)
,Missing
,要么类似于Option
的工作方式Nullified
。我在定义这样的结构时没有问题,但不幸的是,我对 JSON4S 的工作原理不太熟悉,或者我如何(也许)"拦截"字段的解析以实现这样的值提取。
作为替代方案,如果解析器将相应的T
字段设置为 null
如果字段field: null
而不是将其设置为 None
,那也很棒。我认为这不会让人感到斯卡拉什。
应该为T
实现自定义序列化程序。我会使用以下格式,因为它允许更大的灵活性和与顺序无关的输入:
import org.json4s.CustomSerializer
import org.json4s.JsonAST._
import org.json4s.JsonDSL._
case class Animal(name: String, nrLegs: Int)
class AnimalSerializer extends CustomSerializer[Animal](format => ( {
case jsonObj: JObject =>
val name = (jsonObj "name") //JString
val nrLegs = (jsonObj "nrLegs") //JInt
Animal(name.extract[String], nrLegs.extract[Int])
}, {
case animal: Animal =>
("name" -> animal.name) ~
("nrLegs" -> animal.nrLegs)
}
))
要处理空/空值,请查看 JSValue 特征。对于空值,应与JNull
匹配,对于不存在的值,应与JNothing
匹配。