0Pricing
Swift Academy · 课时

使用 JSONEncoder 编码

从 Swift 值生成 JSON 数据。

使用 JSONEncoder 编码 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

创建 JSON 编码器

JSONEncoder 是将任何符合 Encodable 的值转换为 JSON Data 的核心工具。创建一个编码器,然后对您的值调用 encode(_:)。

import Foundation

struct Movie: Codable {
    var title: String
    var year: Int
}

let encoder = JSONEncoder()
let data = try encoder.encode(Movie(title: "Up", year: 2009))
print(data.count, "bytes")

从 Data 转换为可读字符串

encode(_:) 返回二进制 Data。要读取它,请使用 String(data:encoding:) 将这些字节按 UTF-8 解码。

import Foundation

struct Movie: Codable {
    var title: String
    var year: Int
}

let data = try JSONEncoder().encode(Movie(title: "Up", year: 2009))
let text = String(data: data, encoding: .utf8)!
print(text)

格式化输出

JSON 默认采用紧凑格式。设置 outputFormatting = .prettyPrinted 可添加缩进和换行,让结果更易于人类阅读。

import Foundation

struct Movie: Codable {
    var title: String
    var year: Int
}

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(Movie(title: "Up", year: 2009))
print(String(data: data, encoding: .utf8)!)

使用排序键生成稳定输出

您可以使用数组组合多个选项。添加 .sortedKeys 会按字母顺序排列键,从而使输出具有确定性,非常适合测试和快照。

import Foundation

struct Movie: Codable {
    var title: String
    var year: Int
    var rating: Double
}

let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
let data = try encoder.encode(Movie(title: "Up", year: 2009, rating: 4.8))
print(String(data: data, encoding: .utf8)!)

编码数组

您可以直接编码集合。由 Encodable 值组成的数组会变成 JSON 数组。

import Foundation

struct Movie: Codable {
    var title: String
    var year: Int
}

let list = [Movie(title: "Up", year: 2009),
            Movie(title: "Coco", year: 2017)]
let data = try JSONEncoder().encode(list)
print(String(data: data, encoding: .utf8)!)

编码字典

[String: Encodable-element] 字典会编码为 JSON 对象。请注意,除非添加 .sortedKeys,否则键的顺序并不保证固定。

import Foundation

let scores: [String: Int] = ["alice": 90, "bob": 75]
let encoder = JSONEncoder()
encoder.outputFormatting = .sortedKeys
let data = try encoder.encode(scores)
print(String(data: data, encoding: .utf8)!)

编码嵌套结构

嵌套的 Codable 类型会递归编码,自动生成嵌套的 JSON 对象。

import Foundation

struct Author: Codable { var name: String }
struct Post: Codable {
    var title: String
    var author: Author
}

let p = Post(title: "Hello", author: Author(name: "Mae"))
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
print(String(data: try encoder.encode(p), encoding: .utf8)!)

重复使用编码器

配置好的 JSONEncoder 可以用于多个值。只需配置一次,就能在整个代码中持续使用相同的格式设置。

import Foundation

struct Tag: Codable { var name: String }

let encoder = JSONEncoder()
encoder.outputFormatting = .sortedKeys
for t in [Tag(name: "swift"), Tag(name: "json")] {
    let data = try encoder.encode(t)
    print(String(data: data, encoding: .utf8)!)
}

编码数字和布尔值

数值和布尔属性会编码为 JSON 字面量,不带引号。字符串会带引号;Int、Double 和 Bool 则不会。

import Foundation

struct Stats: Codable {
    var count: Int
    var ratio: Double
    var enabled: Bool
}

let data = try JSONEncoder().encode(Stats(count: 3, ratio: 0.75, enabled: true))
print(String(data: data, encoding: .utf8)!)

编码可选值

默认情况下,值为 nil 的可选值会完全从 JSON 中省略。非 nil 的可选值会编码为其包装的值。

import Foundation

struct Item: Codable {
    var name: String
    var note: String?
}

let data = try JSONEncoder().encode(Item(name: "Pen", note: nil))
print(String(data: data, encoding: .utf8)!)

整合起来

典型的编码流程是:构建值、配置编码器、调用 encode,然后将 Data 转换为 String,用于日志记录或传输。

import Foundation

struct Order: Codable {
    var id: Int
    var items: [String]
}

let order = Order(id: 42, items: ["a", "b"])
let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
let data = try encoder.encode(order)
print(String(data: data, encoding: .utf8)!)

快速检查:JSON 编码器

测试您对编码的理解。

回顾:使用 JSON 编码器进行编码

您已经学习了如何将 Swift 值转换为 JSON:

  • encode(_:) 返回 Data;使用 String(data:encoding:) 进行转换。
  • 使用 .prettyPrinted 和 .sortedKeys 设置 outputFormatting,可以控制布局。
  • 数组、字典、嵌套类型、数字、布尔值和可选值都能以合理的方式进行编码。
  • 配置好的编码器可以在多个值之间重复使用。

常见问题解答

「使用 JSONEncoder 编码」课时是免费的吗?

是的 — 「使用 JSONEncoder 编码」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「使用 JSONEncoder 编码」这节课中我会学到什么?

从 Swift 值生成 JSON 数据。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「使用 JSONEncoder 编码」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 遵循 Codable
  2. 使用 JSONEncoder 编码
  3. 使用 JSONDecoder 解码
  4. 处理可选类型与嵌套类型
← 返回 Swift Academy