Play ScalaJSON Читает [T] парсинг ValidationError (error.path.missing, WrappedArray())

У меня есть смешные json-данные, выглядящие как:

[ {
  "internal_network" : [ {
    "address" : [ {
      "address_id" : 2,
      "address" : "172.16.20.1/24"
    }, {
      "address_id" : 1,
      "address" : "172.16.30.30/24"
    } ]
  } ],
  "switch_id" : "0000000000000001"
}, {
  "internal_network" : [ {
    "address" : [ {
      "address_id" : 2,
      "address" : "172.16.30.1/24"
    }, {
      "address_id" : 1,
      "address" : "192.168.10.1/24"
    }, {
      "address_id" : 3,
      "address" : "172.16.10.1/24"
    } ]
  } ],
  "switch_id" : "0000000000000002"
} ]

я написал классы case и пользовательские чтения:

  case class TheAddress(addr: (Int, String))
  implicit val theAddressReads: Reads[TheAddress] = (
    (__ \ "address_id").read[Int] and
      (__ \ "address").read[String] tupled) map (TheAddress.apply _)

  case class Addresses(addr: List[TheAddress])
  implicit val addressesReads: Reads[Addresses] =
    (__ \ "address").read(list[TheAddress](theAddressReads)) map (Addresses.apply _)

  case class TheSwitch(
    switch_id: String,
    address: List[Addresses] = Nil)
  implicit val theSwitchReads: Reads[TheSwitch] = (
    (__ \ "switch_id").read[String] and
    (__ \ "internal_network").read(list[Addresses](addressesReads)))(TheSwitch)

  case class Switches(col: List[TheSwitch])
  implicit val switchesReads: Reads[Switches] = 
    (__ \ "").read(list[TheSwitch](theSwitchReads)) map (Switches.apply _)

когда я проверяю предоставленные данные с помощью:

val json: JsValue = Json.parse(jsonChunk)
println(json.validate[TheSwitch])

я получаю:

JsError(List((/switch_id,List(ValidationError(error.path.missing,WrappedArray()))), (/internal_network,List(ValidationError(error.path.missing,WrappedArray())))))

Я могу получить к нему доступ с помощью JsPath, например

val switches: Seq[String] = (json \\ "switch_id").map(_.as[String])

но я действительно нахожусь в своем уме с тем, что я делаю неправильно с пользовательскими чтениями. я попытался поставить еще один ключ верхнего уровня и другие комбинации, но, похоже, я пропустил что-то важное, так как я начал с этого только сегодня.

Большое спасибо.

Ответ 1

Ошибка говорит вам, что вместо /switch_id он получил массив. Поэтому кажется, что вы должны прочитать JSON как List[Switch] вместо Switch

Предполагая, что ваш Reads (не проверял их) корректен, это должно работать:

val json: JsValue = Json.parse(jsonChunk)
println(json.validate[List[TheSwitch]])