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

Scala 如何使用Circe删除对象列表中的空值,scala,circe,Scala,Circe,我尝试使用Circe对对象列表进行编码,类似于: val test=Seq(MyObject(“你好”,无,1,2,无) 我正在尝试使用Circe解析此内容: test.asJson 但这会创建JSON对象: [ { name: "hello", someVal: null, someNum: 1, anotherNum: 2, anotherVal: null } ] 我已经尝试使用.dropNullValues运行asJson,但这似乎无法访

我尝试使用Circe对对象列表进行编码,类似于:

val test=Seq(MyObject(“你好”,无,1,2,无)

我正在尝试使用Circe解析此内容:

test.asJson

但这会创建JSON对象:

[
  {
    name: "hello",
    someVal: null,
    someNum: 1,
    anotherNum: 2,
    anotherVal: null
  }
]
我已经尝试使用
.dropNullValues
运行
asJson
,但这似乎无法访问对象内部的空值。是否有方法将空值删除到对象内部

我期待着更像这样的事情:

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

您会看到
字段:null
,因为circe在
Some[T]上将
选项[T]
转换为
T.asJson
None
上的
JsonNull
,默认的case class encoder只是将所有字段放入
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:

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

或者实现一个自定义文件夹。

尝试test.asJson.deepDropNullValues

这是最简单的答案。这应该标记为接受的答案。