Play ScalaJSON Reads[T] parsing ValidationError(error.path.missing,WrappedArray())
13,157
The error is telling you that instead of /switch_id
it got an array. So it seems like you should read the JSON as a List[Switch]
instead of just Switch
Assuming your Reads
(didn't test them) are correct this should work:
val json: JsValue = Json.parse(jsonChunk)
println(json.validate[List[TheSwitch]])
Related videos on Youtube
Author by
FoggyDew
Updated on September 15, 2022Comments
-
FoggyDew over 1 year
i have a funny json data looking as:
[ { "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" } ]
i wrote case classes and custom reads:
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 _)
when i validate the provided data with:
val json: JsValue = Json.parse(jsonChunk) println(json.validate[TheSwitch])
i get:
JsError(List((/switch_id,List(ValidationError(error.path.missing,WrappedArray()))), (/internal_network,List(ValidationError(error.path.missing,WrappedArray())))))
i can access it with JsPath like
val switches: Seq[String] = (json \\ "switch_id").map(_.as[String])
but i'm really at my wits end with what am i doing wrong with custom reads. i've tried with putting another top level key, and other combinations, but seems i'm missing something crucial, since i've started with this just today.
thanks a lot.
-
FoggyDew about 10 yearsthank you. crucial indeed. i've missed the semantics of it. and tried to add the Switches to deal with the root level. hahaha, doesn't work that way. bless you.