[英]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.asJson
在Some[T]
和JsonNull
对None
,并且默认情况下,类编码器只是把各个领域的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.