从JSON中获取值并根据变量类型进行处理- Scala



我是Scala的新手,我需要弄清楚如何根据两种情况处理JSON。

首先是我收到这样一个JSON:{..."field":[{"count":1,"value":"foo"}]...}
第二种情况是我收到这种JSON:{..."field":"foo"...}

我无法确定每个JSON何时会进来(它是随机的)。在这两种情况下,我都需要获得field值并将其存储为单独的JSON字符串。第二种情况是显而易见的,因为它已经是一个字符串,但我不知道如何确定这个字段是数组还是字符串,如果数组然后从JSON中获得"foo"。我知道如何访问field,因为它是一个游标:
val field = cursor.downField("foo").downField("bar").downField("lorem").downField("field")
下面是我的方法不工作的例子:

if (field.asInstanceOf[String]) {
rowFiltered.set("field", field.as[String])
} else {
rowFiltered.set("field", field.as[Seq[field[0]]])
}

帮助决定和分配将是感激的。

您可以使用orElse并传递另一个解析

import io.circe._
import io.circe.literal.JsonStringContext

object App {
final case class MyField(value: String)
def main(args: Array[String]): Unit = {
val jsonValue01: Json =
json"""{
"hello": "world",
"field":[{"count":1,"value":"foo01"}],
"foo" : "bar"
}"""
val jsonValue02: Json =
json"""{
"hello": "world",
"field": "foo02",
"foo" : "bar"
}"""
implicit val decodeField: Decoder[MyField] = new Decoder[MyField] {
final def apply(c: HCursor): Decoder.Result[MyField] =
for {
foo <- c.downField("field").downN(0).downField("value").as[String]
.orElse(c.downField("field").as[String])
} yield {
new MyField(foo)
}
}
val myField01 = jsonValue01.as[MyField]
val myField02 = jsonValue02.as[MyField]
println(myField01) //Right(MyField(value = foo01))
println(myField02) //Right(MyField(value = foo02))
}
}