scala 如何使用zio-json而不是null将None编码为缺少的json字段?

bxjv4tth  于 2023-05-29  发布在  Scala
关注(0)|答案(2)|浏览(127)

假设我有一个case类,其中包含可选字段nickName和codec,如下所示:

final case class Person(name: String, nickName: Option[String])

object Person {
  implicit val personCodec: JsonCodec[Person] = DeriveJsonCodec.gen
}

我想用zio-json (v1.5.0)编码它,结果如下:

{"name":"SomeName"}

这是我的测试

encoder.encodeJson(Person("SomeName", None), None).toString shouldBe """{"name":"SomeName"}""".stripMargin

看起来像zio-jsonnull编码None,我得到了测试错误:

Expected :"{"name":"SomeName"[]}"
Actual   :"{"name":"SomeName"[,"nickName":null]}"

我检查了代码并找到了Option www.example.com的编码器https://github.com/zio/zio-json/blob/52d007ee22f214d12e1706b016f149c3243c632c/zio-json/shared/src/main/scala/zio/json/encoder.scala#L188-L202
有什么办法可以把它编码成缺少的JSON字段吗?

5cnsuln7

5cnsuln71#

implicit val OptionStringCodec: JsonCodec[Option[String]] = JsonCodec.string.xmap( s =>
    s match {
      case null | "" => None
      case s         => Some(s)
    },
    _.getOrElse("")
)
yzuktlbb

yzuktlbb2#

  • 注意:我不熟悉sith zio-json,可能有另一种方式,比如配置来实现同样的事情。*

给定你链接的代码示例,你可以很容易地编写一个编码器,通过复制大部分代码,但修改:

def unsafeEncode(oa: Option[A], indent: Option[Int], out: Write): Unit = oa match {
  case None    => () // out.write("null")
  case Some(a) => A.unsafeEncode(a, indent, out)
}

相关问题