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

Scala 如何在Circe中将null解码为空字符串,scala,circe,Scala,Circe,我有下面的案例课 case class Response(attributes: CsvAttributes, rows: Seq[Array[String]]) 行从Java库中获取,该库可以在数组中包含空元素,如下所示: [ ["a", "b", null], ["c", null, "d"] ] 响应(属性、行).asJson.noSpaces抛出错误 如何将空元素编码为空字符串(“”?您可以为响应使用自定义解码器: implicit val decodeResponse: D

我有下面的案例课

case class Response(attributes: CsvAttributes, rows: Seq[Array[String]])
从Java库中获取,该库可以在数组中包含空元素,如下所示:

[
  ["a", "b", null],
  ["c", null, "d"]
]
响应(属性、行).asJson.noSpaces
抛出错误


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

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

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

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

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

谢谢你的回答。如果我们必须迭代,那么我可以直接创建新行,用
null
值替换为
,然后使用
Response(attributes,newRows).asJson.noSpaces
通常在Scala中应该避免
null
。您可以使用
选项。None
表示
null
值。如果你需要更多的信息,我可以把它添加到我的答案中。让我知道。
implicit val encodeString = 
  Encoder.encodeString.contramap[String](s => if (s == null) "" else s)