Есть много способов сделать это. Например:
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()))