【问题标题】:How to decode a Json with a root array?如何使用根数组解码 Json?
【发布时间】:2018-06-13 11:49:34
【问题描述】:

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

直接提取到案例类而不是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

有没有“正确”的解码根数组的方法? 有任何优雅的方法吗?

【问题讨论】:

    标签: scala case-class json4s http4s


    【解决方案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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2021-11-07
      • 2015-01-12
      • 2011-02-05
      • 1970-01-01
      相关资源
      最近更新 更多