繁体   English   中英

如何使用 Circe 删除对象列表中的空值

[英]How to remove null values in list of objects using Circe

我正在尝试使用 Circe 对对象列表进行编码,看起来类似于:

val test = Seq(MyObject("hello", None, 1, 2, None)

我正在尝试使用 Circe 解析这个:

test.asJson

但这会创建 JSON 对象:

[
  {
    name: "hello",
    someVal: null,
    someNum: 1,
    anotherNum: 2,
    anotherVal: null
  }
]

我试着运行asJson.dropNullValues ,但这似乎并没有访问对象内的空值。 有没有办法删除对象内的空值?

我期待更像这样的东西:

[
  {
    name: "hello",
    someNum: 1,
    anotherNum: 2
  }
]

尝试 test.asJson.deepDropNullValues

@iva-kmm建议的答案很好,但可以做得更好!

这个机制已经在 circe 中实现了,只需调用它:

implicit val fooEnc: Encoder[Foo] = deriveEncoder[Foo].mapJson(_.dropNullValues) // or _.deepDropNullValues

你看field: null ,因为瑟茜轮流Option[T]t.asJsonSome[T]JsonNullNone ,并且默认情况下,类编码器只是把各个领域的JsonObject 在 circe 用于编码密封特征族的方式中,它可以使用这些null字段来区分类,例如

sealed trait Foo
case class Bar(a: Option[String])
case class Baz(a: Option[String], b: Option[String])

因此,如果您真的想删除此信息并需要进行信息丢失的单向转换,您可以将生成的Json映射到使用以下代码删除所有空字段:


implicit val fooEnc: Encoder[Foo] = deriveEncoder[Foo].mapJsonObject{jsonObj => jsonObj.filter{case (k,v) => !v.isNull}}

但是,您应该为要删除空字段的任何类编写这样的自定义编解码器。 要对您的 json 进行后处理,您可以对生成的 json 使用 fold:

  val json: Json = ???
  json.fold[Json](
    Json.Null,
    Json.fromBoolean,
    {_.asJson},
    {_.asJson},
    {_.asJson},
    {jsonObj => jsonObj.filter{case (k,v) => !v.isNull}.asJson}
  )

或实现自定义文件夹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM