Play ScalaJSON Reads[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 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]])