7

我正在使用 scala 2.11.8 和 circe 0.7.0

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

我正在寻找一种将case class包含Option[T]字段的 scala 编码为 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
test.asJson.noSpace
//>{"optionalFieldOne": 42,"optionalFieldTwo":null, "optionalFieldThree":null}

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

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

如果此类配置选项不可用,有人将如何正确实现它?

4

3 回答 3

1

使用dropNullKeys

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

于 2017-04-06T08:40:58.800 回答
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)
    }
  }
于 2019-06-08T12:11:03.670 回答
0

使用此链接中提到的 dropNullValues : https ://github.com/circe/circe/issues/585

于 2018-11-19T11:42:07.670 回答