我是 Scala 的新手,我需要弄清楚如何根據兩種情況處理 JSON。
首先是我收到此類 JSON 的地方:
{..."field":[{"count":1,"value":"foo"}]...}
第二種情況是我收到此類 JSON 的地方:{..."field":"foo"...}
我無法確定每個 JSON 何時會出現(它是隨機的)。在這兩種情況下,我都需要獲取field值并將其作為字串存盤到單獨的 JSON 中。第二種情況很明顯,因為它已經是一個字串,但我不知道如何確定這個欄位是 Array 還是 String,如果 Array"foo"則從其中獲取JSON。我知道如何訪問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]]])
}
幫助確定和分配將不勝感激。
uj5u.com熱心網友回復:
您可以使用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))
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/312796.html
