0Pricing
Scala for Backend Engineering & Functional Programming · 课时

编码为 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 解析 JSON
  2. 解码为样例类
  3. 编码为 JSON
  4. 自定义编解码器
← 返回 Scala for Backend Engineering & Functional Programming