【问题标题】:Ignore None field while Encoding to json with Circe for Scala使用 Circe for Scala 编码为 json 时忽略 None 字段
【发布时间】:2017-09-01 04:02:36
【问题描述】:

我正在使用 scala 2.11.8 和 circe 0.7.0

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

我正在寻找一种将包含 Option[T] 字段的 scala case class 编码为 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 问题和他们的网站文档,但没有成功。

在这种配置选项不可用的情况下,有人将如何正确实现它?

【问题讨论】:

    标签: json scala circe


    【解决方案1】:

    使用dropNullKeys:

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

    【讨论】:

    • 这里的问题是我想保留空值并且只省略设置为无的字段。在这里,您的解决方案将返回 {"optionalFieldOne": 42} 。缺少第二个字段。我已经在link 中阅读过这个解决方案
    【解决方案2】:

    【讨论】:

      【解决方案3】:
      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)
          }
        }
      

      【讨论】:

        猜你喜欢
        • 2017-07-10
        • 2021-06-05
        • 2022-07-09
        • 2020-07-20
        • 2020-08-12
        • 2017-09-06
        • 2020-07-07
        • 2020-10-28
        • 2018-03-10
        相关资源
        最近更新 更多