0

我在弄清楚如何使用库将json带有根数组的 a 解码为案例类时遇到了一些麻烦。json4s-jackson

直接提取到案例类而不是提取到 a 的目的Seq[Username]是在阶段验证单个值的存在decode -> construction,而不是在以后验证。

当根不是数组时,一切正常

工作示例:

{
    "users": [{"name": "someName1"}]
}

case class Username(name: String)
case class UsersInfo(users: Seq[Username])

implicit private def reader: Reader[UsersInfo] = (value: JValue) => value.extract[UsersInfo]

def decode: EntityDecoder[IO, UsersInfo] = jsonOf[IO, UsersInfo]

但是,当一个 json 有一个根数组时,它开始闻起来很糟糕:

[
  {
    "name": "someFancyName"
  }
]

case class UsersInfo extends Seq[Username] // Smelly & does not compile

是否有解码根数组的“正确”方法?有什么优雅的方法吗?

4

1 回答 1

1

一种可能的解决方案可能是在解码器函数中验证解码结果。


替换这个:

implicit private def reader: Reader[UsersInfo] = (value: JValue) => value.extract[UsersInfo]

有类似的东西:

implicit private def reader: Reader[Username] = (value: JValue) => {
  val extracted = value.extract[Seq[UsersInfo]]

  require(extracted.size == 1, s"UserInfo Json must contain a single username value, but it contains [ ${extracted.size} ] values")

  Username(extracted.head.name)
}
于 2018-06-13T13:33:40.430 回答