我正在尝试使用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
}
]
你看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}
)
或实施自定义文件夹。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句