如何检查空的JSON

时间:2019-05-03 06:34:02

标签: scala circe

我正在使用https://circe.github.io/circe/,想弄清楚某个属性是否具有空的JSON对象。 例如:

val json: String = """
  {
    "id": "c730433b-082c-4984-9d66-855c243266f0",
    "name": "Foo",
    "counts": [1, 2, 3],
    "values": {
    }
  }
"""  

您可以在上面的代码中看到,属性values是一个空的JSON结构。
如何验证属性是否为空?

1 个答案:

答案 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()))