如何检查空 JSON

How to check against an empty JSON

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

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

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

有很多方法可以做到这一点。例如:

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