scala - 如何在 Circe 中将 null 解码为空字符串

标签 scala circe

我有以下案例类

case class Response(attributes: CsvAttributes, rows: Seq[Array[String]])

rows从 Java 库中获取,该库可以在数组中包含 null 元素,如下所示:

[
  ["a", "b", null],
  ["c", null, "d"]
]

Response(attributes, rows).asJson.noSpaces抛出错误。

如何将 null 元素编码为空字符串(“”)?

最佳答案

您可以使用自定义解码器进行响应:

implicit val decodeResponse: Decoder[Response] = (c: HCursor) =>
  for {
    attributes <- c.downField("attributes").as[CsvAttributes]
    rows       <- c.downField("rows").as[Seq[Array[Option[String]]]]
  } yield {
    Response(attributes, rows.map(_.map {
      case Some(v) => v
      case None    => ""
    }))
  }

我会尝试将 Java 库的响应转换为惯用的 Scala(例如,将 null 转换为 Option.None)。

但如果您想避免这种情况,您可以覆盖 circe 对 String 进行编码的默认行为。此声明会将其更改为用空字符串表示 null:

implicit val encodeFoo: Encoder[String] = {
  case null => Json.fromString("")
  case s    => Json.fromString(s)
}

关于scala - 如何在 Circe 中将 null 解码为空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47821020/

相关文章:

multithreading - Spark 中每个任务的 CPU 数量

scala - 在 Scala 中进行模式匹配时类型推断不正确

json - 如何在没有案例类的情况下解析 JSON Scala

java - 适合 Scala 的 GUI 框架?

scala - 将过滤器作为参数传递给 Dataframe.filter 函数

scala - 如何修改由cmd sbt包生成的jar名称

scala - 使用 circe 时如何在 Scala 中表示动态 JSON 键

scala - 如何使用 Circe 创建选项类型的自定义编码?

json - 解码json字符串里面的json