Scala:检查案例类树是否包含任何null

时间:2014-07-09 15:31:58

标签: scala

我使用Scala json序列化器,发现它没有为反序列化的案例类设置默认值,而是将这些缺失值设置为null。

幸运的是,直到现在它并没有对我的系统造成多大的损害,主要是因为CRUD只将字段设置为null,但是在将来,我绝对想要强制我的JSON有效负载没有任何空值。

我的Json有效负载通常是某种带有列表和原语的case类树。 它通常非常简单,例如case class Person(addresses: List[Address], name: String, ...) case class Address(street: String, number: Int) ...


  • 有没有办法确保案例类中没有空字段?
  • 如果找到null,有没有办法将其自动设置为默认值而不是null?
  • 它适用于嵌套的案例类吗?

我猜这与Product特质有关,但并不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

您可以在案例类中添加要求,因此序列化将失败:

case class Person(  name: String, 
                    ssn: String,
                    homePhone: Option[Long],
                    cellPhone: Option[Long]){

  require(homePhone.isDefined || cellPhone.isDefined, "Person requires at least one phone number")
  require(ssn.length() == 9 && ssn.forall(Character.isDigit(_)), "ssn must be a String of 9 digits")
}

答案 1 :(得分:0)

可以这是一个解决方案吗?

def isCaseClassEmpty(product: Product): Boolean =
    product.productIterator.forall {
      case None => true
      case Some(x: Product) => isCaseClassEmpty(x)
      case _ => false
    }

case class Inner(b: Option[Int])
case class Root(a: Option[String]: inner: Option[Inner])

val root = Root(None, None))
isCaseClassEmpty(root) // true

val root = Root(None, Some(Inner(None)))
isCaseClassEmpty(root) // true

val root = Root(None, Some(Inner(Some(5))))
isCaseClassEmpty(root) // false

val root = Root(Some("test"), None)
isCaseClassEmpty(root) // false

干杯: - )