You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用io.circe将case class的None字段正确转为不含null的JSON?

如何用Circe序列化时忽略Option为None的字段

当然可以实现这个需求!Circe 针对这种场景提供了很便捷的解决方案,默认情况下它会把 Option 的 None 序列化为 null,但我们可以通过几种方式让序列化结果自动移除这些无用的 null 字段。下面给你介绍两种常用方法:

方法一:序列化后即时移除null字段

这种方式最简单直接,不需要修改编码器的全局配置,只需要在生成JSON后调用 dropNullValues 方法即可:

import io.circe._, io.circe.generic.semiauto._

// 你的case class定义
case class Example(exId: String, exDes: Option[String] = None)

// 自动生成编码器
implicit val exampleEncoder: Encoder[Example] = deriveEncoder[Example]

// 注意:exId是String类型,所以这里要传字符串"1"而非数字1
val example = Example(exId = "1")
// 生成JSON并移除null字段
val json = example.asJson.dropNullValues

// 最终输出: {"exId":"1"}

方法二:全局配置编码器自动忽略null字段

如果你希望所有的编码器都默认忽略 null 字段(尤其是当你有很多case class需要处理时),可以使用 circe-generic-extras 库来配置全局规则:

首先确保你的项目依赖里包含了 circe-generic-extras,然后按以下方式实现:

import io.circe.generic.extras._
import io.circe.generic.extras.semiauto._

// 配置全局序列化规则:移除null值字段
implicit val circeConfig: Configuration = Configuration.default.withDropNullValues

// 你的case class定义
case class Example(exId: String, exDes: Option[String] = None)

// 根据全局配置生成编码器
implicit val exampleEncoder: Encoder[Example] = deriveEncoder[Example]

val example = Example(exId = "1")
val json = example.asJson

// 最终输出同样是: {"exId":"1"}

补充说明

  • 两种方法都能达到你的需求,第一种适合临时处理单个序列化场景,第二种适合全局统一配置。
  • 注意你原代码里的小问题:Example(exId = 1) 会编译报错,因为 exId 定义的是 String 类型,需要传入字符串值比如 "1"。

内容的提问来源于stack exchange,提问作者nongtom naja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:57:51