Как проверить на пустой JSON - PullRequest
1 голос
/ 03 мая 2019

Я использую 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 Ответ

1 голос
/ 03 мая 2019

Есть много способов сделать это. Например:

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