Как разобрать вариант Json, используя библиотеку Circe со Scala? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать декодер для моей модели Json, используя классы дел, но не могу найти способ декодировать список вариантов jsons.

object CirceTester {

  def main(args: Array[String]): Unit = {

    val json = """{
  "foo": "bar",
  "baz": "123.34",
  "list of stuff": [ "4", "5", "6","24545","435.030" ],
  "jsonlist": [ {"name":"Jesus","age":20},{"name":"Pedro","age":45}]
}
"""


     case class Person(name:String,age:Int)

    implicit val decodePerson : Decoder[Person] = {

      Decoder.forProduct2("name","age")(Person.apply)

    }

    val parsedJson = parse(json)


    val list = parsedJson match {
      case Left(parsingFailure) => throw new Exception("Failed to parse Json")
      case Right(parsedJson) => parsedJson.hcursor.downField("jsonlist").as[List[Person]]


    }

  }       
}    

Если Json написан таким образом, он работает нормально, но если у Json есть список вариантов Jsons, как в случае с jsonlist, код завершится ошибкой.

Например

val json = """{
  "foo": "bar",
  "baz": "123.34",
  "list of stuff": [ "4", "5", "6","24545","435.030" ],
  "jsonlist": [ {"name":"Jesus","age":20},{"name":"Pedro"}]
}
""" 

В этом случае вторым элементом jsonlist является другой Json, в котором отсутствует поле «age», и, как я уже сказал, оно выдаст исключение. Могу ли я разобрать этот вложенный Json, даже если он не соответствует структуре класса case

1 Ответ

0 голосов
/ 02 ноября 2018

Как теперь понятно, вопросы стоят о чтении необязательных значений из json.

Изменение модели для соответствия структуре json, которую вы пытаетесь проанализировать, является одним из лучших вариантов здесь. Так что в этом случае age поле должно быть необязательным: case class Person(name: String, age: Option[Int]).

Если вы не можете изменить определение Person, вы можете определить промежуточный case class PersonRecord(name: String, age: Option[Int]) и написать собственный метод def toPerson: Person внутри - таким образом, это более понятно, чем создавать собственную логику в считывателях json.

...