Кодирование с помощью JSONEncoder
Создавайте данные JSON из значений Swift.
«Кодирование с помощью JSONEncoder» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Создание JSONEncoder
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. Чтобы прочитать их, декодируйте байты как UTF-8 с помощью String(data:encoding:).
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)!)Быстрая проверка: JSONEncoder
Проверьте свои знания о кодировании.
Повторение: кодирование с помощью JSONEncoder
Вы научились превращать значения Swift в JSON:
encode(_:)возвращаетData; преобразуйте их с помощьюString(data:encoding:).- Параметр
outputFormattingсо значениями.prettyPrintedи.sortedKeysуправляет оформлением. - Массивы, словари, вложенные типы, числа, логические значения и опциональные значения кодируются предсказуемым образом.
- Настроенный кодировщик можно повторно использовать для множества значений.
Часто задаваемые вопросы
Урок «Кодирование с помощью JSONEncoder» бесплатный?
Да — полный текст урока «Кодирование с помощью JSONEncoder» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Кодирование с помощью JSONEncoder»?
Создавайте данные JSON из значений Swift. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Кодирование с помощью JSONEncoder»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Соответствие Codable
- Кодирование с помощью JSONEncoder
- Декодирование с помощью JSONDecoder
- Работа с необязательными и вложенными типами