使用Circe for Scala编码为json时忽略无字段

时间:2017-04-06 08:32:20

标签: json scala circe

我正在使用scala 2.11.8,其中包含0.7.0

我使用scalajs与API区分不同的字段和发送的JSON中的null字段。

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

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
val.asJson.noSpace
//>{"optionalFieldOne": 42,"optionalFieldTwo":null, "optionalFieldThree":null}

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

circe是否提供了任何可能的配置?您是否知道如何访问它,我已经查看了所有发行说明,github问题和他们的网站文档但没有成功。

如果此类配置选项不可用,有人会如何正确实施?

3 个答案:

答案 0 :(得分:2)

使用dropNullKeys

  

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

答案 1 :(得分:0)

答案 2 :(得分: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)
    }
  }