【问题标题】:How to decode missing json array as empty List with circe如何使用 circe 将丢失的 json 数组解码为空列表
【发布时间】:2019-10-30 02:11:45
【问题描述】:

例如,我们有一些案例类

case class Foo(a: Int, b: List[String])

我们想从 json {"a": 1} 反序列化 Foo 的实例,用 Nil 替换缺少的 b 数组

我们可以为这种行为创建自定义解码器

implicit val fooDecoder: Decoder[Foo] = (c: HCursor) => 
  for {
    a <- c.downField("a").as[Int]
    b <- c.downField("b").as[Option[List[String]]
  } yield Foo(a, b.getOrElse(Nil))

但是,不幸的是,以这种方式创建的解码器不会累积所有解码失败。

有什么方法可以创建具有故障累积的解码器或任何方法来替换 circe 中的标准列表反序列化行为?

【问题讨论】:

    标签: json scala circe


    【解决方案1】:

    尝试像这样使用circe-generic-extras 提供defaultb: List[String] = Nil

    import io.circe.parser._
    import io.circe.generic.extras.Configuration
    import io.circe.generic.extras.auto._
    
    implicit val config: Configuration = Configuration.default.withDefaults
    case class Foo(a: Int, b: List[String] = Nil)
    val raw = """{"a": 1}"""
    decode[Foo](raw) // res0: Either[io.circe.Error,Foo] = Right(Foo(1,List()))
    

    在哪里

    libraryDependencies ++= Seq(
      "io.circe" %% "circe-core" % "0.12.0-M3",
      "io.circe" %% "circe-parser" % "0.12.0-M3",
      "io.circe" %% "circe-generic-extras" % "0.12.0-M3",
      "io.circe" %% "circe-generic" % "0.12.0-M3"
    )
    

    【讨论】:

      【解决方案2】:

      你也可以使用.map(_.getOrElse(List.empty))

      implicit val fooDecoder: Decoder[Foo] = (c: HCursor) => 
        for {
          a <- c.downField("a").as[Int]
          b <- c.downField("b").as[Option[List[String]].map(_.getOrElse(List.empty))
        } yield Foo(a, b)
      

      【讨论】:

        猜你喜欢
        • 2017-07-06
        • 2021-11-07
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-28
        相关资源
        最近更新 更多