编码为 JSON
将您的数据序列化输出。
编码为 JSON 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
编码器生成 JSON
Encoder[A] 是解码器的对应部分:它会将类型为 A 的 Scala 值转换为 Circe 的 Json 树。
接下来,您可以将其序列化为 String,用于 HTTP 响应、日志或存储。
asJson 语法
导入 io.circe.syntax._,即可为任何在当前作用域中具有 Encoder 的值提供 .asJson 扩展方法。
基本类型和集合可以立即使用。
import io.circe.syntax._
println(42.asJson.noSpaces) // 42
println("hi".asJson.noSpaces) // "hi"
println(List(1,2,3).asJson.noSpaces) // [1,2,3]派生编码器
与解码器一样,样例类的编码器也可以派生。导入 io.circe.generic.auto._ 即可自动派生。
字段名会成为 JSON 键,字段值则会递归编码。
import io.circe.generic.auto._
import io.circe.syntax._
case class User(name: String, age: Int)
println(User("Ada", 36).asJson.noSpaces)
// {"name":"Ada","age":36}半自动编码器
如果需要显式且可复用的实例,请使用来自 io.circe.generic.semiauto 的 deriveEncoder。
将它放在伴生对象中,可以让整个代码库共享一个 Encoder[User] 实例。
import io.circe.Encoder
import io.circe.generic.semiauto._
object User {
implicit val enc: Encoder[User] = deriveEncoder[User]
}手动构建 Json
您可以使用 Json.obj 和键值对直接构造 JSON,其中的值使用 .asJson。
对于无法映射到样例类的临时结构,这种方式非常方便。
import io.circe.Json
import io.circe.syntax._
val j = Json.obj(
"ok" -> true.asJson,
"count" -> 3.asJson
)
println(j.noSpaces) // {"ok":true,"count":3}编码选项
Option[A] 字段默认会将 Some(x) 编码为该值,将 None 编码为 JSON 的 null。
如果您希望完全省略值为 null 的键,可以在编码后将它们删除,后文会介绍这种做法。
case class Account(id: Long, nick: Option[String])
println(Account(7, None).asJson.noSpaces)
// {"id":7,"nick":null}删除 null 值
要省略 null 值,请使用 .deepDropNullValues 转换生成的 Json。
它会递归删除值为 null 的键,为可选字段生成更简洁的输出。
val clean = Account(7, None).asJson.deepDropNullValues
println(clean.noSpaces)
// {"id":7}美化输出
使用 .spaces2 或 .spaces4 生成带缩进、便于阅读的 JSON,使用 .noSpaces 生成紧凑的传输格式。
如果需要完全控制格式,请构建自定义的 Printer。
import io.circe.Printer
val printer = Printer.spaces2.copy(dropNullValues = true)
println(printer.print(Account(7, None).asJson))编码 Map
Map[String, A] 会编码为 JSON 对象,其中 Map 的键会成为 JSON 键。
对于非字符串键类型,您必须提供一个 KeyEncoder,将键转换为文本。
import io.circe.syntax._
val scores = Map("ada" -> 90, "alan" -> 85)
println(scores.asJson.noSpaces)
// {"ada":90,"alan":85}对编码器进行映射
您可以使用 contramap 调整现有编码器:提供一个从您的类型转换为 Circe 已支持编码的类型的函数。
这样可以避免从头编写完整的编码器。
import io.circe.Encoder
case class UserId(value: Long)
implicit val enc: Encoder[UserId] =
Encoder[Long].contramap(_.value)同时进行编码和解码
当您需要双向转换时,可以使用 deriveCodec 推导出一个 Codec[A],它会将编码器和解码器打包在一起。
这样,随着样例类不断演变,两者仍能保持同步。
import io.circe.Codec
import io.circe.generic.semiauto._
implicit val codec: Codec[User] = deriveCodec[User]快速检查
检验您对编码为 JSON 的理解。
回顾
Encoder[A] 会将 Scala 值转换为 Json。对于派生的编码器,请使用 .asJson;也可以使用 Json.obj 构建 JSON 树。
除非将其删除,否则 None 会变为 null;contramap 可以复用编码器;deriveCodec 会将两个方向的转换打包在一起。
常见问题解答
「编码为 JSON」课时是免费的吗?
是的 — 「编码为 JSON」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。
「编码为 JSON」这节课中我会学到什么?
将您的数据序列化输出。 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「编码为 JSON」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?
能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。