如何在 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)
我有以下情况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)