本文介绍了播放 ScalaJSON Reads[T] 解析 ValidationError(error.path.missing,WrappedArray())的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个有趣的 json 数据:

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])

我明白了:

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

我可以像 JsPath 一样访问它

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.

非常感谢.

推荐答案

错误告诉你它得到了一个数组而不是 /switch_id.因此,您似乎应该将 JSON 作为 List[Switch] 而不是 Switch

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

假设你的 Reads(没有测试它们)是正确的,这应该可以工作:

Assuming your Reads (didn't test them) are correct this should work:

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

这篇关于播放 ScalaJSON Reads[T] 解析 ValidationError(error.path.missing,WrappedArray())的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-30 19:10