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

How to decode null to empty string in Circe

我有以下情况class

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

rows 是从 Java 库中获取的,它可以在数组中包含空元素,如下所示:

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

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

如何将空元素编码为空字符串("")?

您可以为 Response 使用自定义解码器:

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

另一种快速而肮脏的方法是:

implicit val encodeString = 
  Encoder.encodeString.contramap[String](s => if (s == null) "" else s)