使用Scala的Circe编码为json时忽略空字段。

8

我正在使用scala 2.11.8和circe 0.7.0

我正在使用scalajs与一个API通信,区分发送的JSON中不存在的字段和null字段。

我正在寻找一种编码为JSON的方法,该方法包含将设置为None以表示缺失值的Option[T]字段的scala case class

case class Foo(
optionalFieldOne: Option[Int] = 42,
optionalFieldTwo: Option[Int] = null,
optionalFieldThree: Option[Int] = None
)

implicit FooEncoder: Encoder[Foo] = deriveEncoder[Foo]
val test = Foo()
//What the code actually produces
test.asJson.noSpace
//>{"optionalFieldOne": 42,"optionalFieldTwo":null, "optionalFieldThree":null}

//What I would like
test.asJson.noSpace
//>{"optionalFieldOne": 42,"optionalFieldTwo":null}

circe提供了任何可配置的选项吗?您知道如何访问它吗?我已经查看了所有发布说明、GitHub问题和网站文档,但没有成功。

如果不存在此类配置选项,那么有什么正确实现的方法吗?

3个回答

1

使用dropNullKeys

@param dropNullKeys 确定是否从输出中删除值为null的对象字段。


问题在于我想保留null值,只省略设置为None的字段。在这种情况下,您的解决方案将返回{"optionalFieldOne": 42}。第二个字段缺失。我已经在此链接中阅读了此解决方案:link - amougel

0
implicit class JsonWrapper(val json: Json) {
    def removeNulls(): Json = {
      val result = json match {
        case j1 if j1.isArray =>
          j1.mapArray(_.map(_.removeNulls()))

        case j2 if j2.isObject =>
          j2.mapObject(_.removeNulls())

        case v => v
     }
     result
    }
  }

implicit class JsonObjectWrapper(val json: JsonObject) {
    def removeNulls(): JsonObject = {
      json.mapValues{
        case v if v.isObject => v.removeNulls()
        case v if v.isArray  => v.mapArray(_.map(_.removeNulls()))
        case other                => other
      }.filter(!_._2.isNull)
    }
  }

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接