我正在使用https://circe.github.io/circe/,想弄清楚某个属性是否具有空的JSON对象。 例如:
val json: String = """
{
"id": "c730433b-082c-4984-9d66-855c243266f0",
"name": "Foo",
"counts": [1, 2, 3],
"values": {
}
}
"""
您可以在上面的代码中看到,属性values
是一个空的JSON结构。
如何验证属性是否为空?
答案 0 :(得分:1)
有很多方法可以做到这一点。例如:
import io.circe.jawn.parse
def valuesIsEmpty(in: String): Option[Boolean] = for {
parsed <- parse(in).right.toOption
parsedObj <- parsed.asObject
values <- parsedObj("values")
valuesObj <- values.asObject
} yield valuesObj.size == 0
然后:
scala> valuesIsEmpty(json)
res0: Option[Boolean] = Some(true)
此处None
表示输入内容无效JSON或不是具有values
成员的对象。
尽管如此,通常您不会在此级别上执行验证,而是将其内置到解码器中。例如:
import io.circe.Decoder, io.circe.generic.semiauto.deriveDecoder
case class Entry(id: String, name: String, counts: List[Int], values: Map[String, String])
implicit val decodeEntry: Decoder[Entry] = deriveDecoder[Entry].emap {
case e if e.values.isEmpty => Left("empty values")
case e => Right(e)
}
然后:
scala> io.circe.jawn.decode[Entry](json)
res0: Either[io.circe.Error,Entry] = Left(DecodingFailure(empty values, List()))