我有一个有趣的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])
但是我真的不知所措,我在自定义读取方面做错了什么。我已经尝试过放置另一个顶级键和其他组合,但是似乎我缺少了一些关键的东西,因为我是从今天开始的。
非常感谢。
错误告诉您不是/switch_id数组而是数组。因此,似乎您应该阅读JSON List[Switch]而不是Switch
/switch_id
List[Switch]
Switch
假设您Reads(没有测试它们)是正确的,那么应该可以:
Reads
val json: JsValue = Json.parse(jsonChunk) println(json.validate[List[TheSwitch]])