0Pricing
Swift Academy · Урок

Codable: кодирование и декодирование JSON

Реализуйте Codable, пользовательские CodingKeys и декодирование вложенных контейнеров.

«Codable: кодирование и декодирование JSON» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Протокол Codable

Codable — это псевдоним типа для Encodable & Decodable. Типы, соответствующие этому протоколу, можно автоматически кодировать в JSON и декодировать из JSON.

struct User: Codable {
  var name: String
  var age: Int
}

Автоматическая генерация реализации

Swift автоматически генерирует реализации Codable, если все сохраняемые свойства сами соответствуют Codable.

struct Product: Codable {
  var id: Int
  var title: String
  var price: Double
  // init(from:) and encode(to:) are auto-generated
}

Декодирование JSON

Используйте JSONDecoder, чтобы декодировать Data в тип Decodable.

let json = #"{"name":"Alice","age":30}"#.data(using: .utf8)!
let user = try JSONDecoder().decode(User.self, from: json)
print(user.name) // Alice

Кодирование в JSON

Используйте JSONEncoder, чтобы закодировать значение Codable в Data.

let user = User(name: "Bob", age: 25)
let data = try JSONEncoder().encode(user)
print(String(data: data, encoding: .utf8)!)

Пользовательские CodingKeys

Используйте перечисление CodingKeys для сопоставления имён свойств Swift и ключей JSON.

struct Article: Codable {
  var createdAt: Date
  enum CodingKeys: String, CodingKey {
    case createdAt = "created_at"
  }
}

Стратегии декодирования дат

Настройте JSONDecoder.dateDecodingStrategy для разбора дат в различных форматах.

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let article = try decoder.decode(Article.self, from: data)

Вложенные контейнеры

Декодируйте вложенные объекты JSON, определяя вложенные структуры Codable или используя контейнеры с ключами вручную.

struct Response: Codable {
  struct Data: Codable {
    var users: [User]
  }
  var data: Data
}
let resp = try JSONDecoder().decode(Response.self, from: json)

Пользовательская логика декодирования

Переопределите init(from:) для нестандартных структур JSON или преобразования данных во время декодирования.

struct Rating: Codable {
  var stars: Int
  init(from decoder: Decoder) throws {
    let container = try decoder.singleValueContainer()
    let raw = try container.decode(Double.self)
    stars = Int(raw.rounded())
  }
  func encode(to encoder: Encoder) throws {
    var container = encoder.singleValueContainer()
    try container.encode(Double(stars))
  }
}

keyDecodingStrategy

Используйте .convertFromSnakeCase для автоматического преобразования ключей JSON в формате snake_case в свойства Swift в формате camelCase.

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let user = try decoder.decode(User.self, from: data)
// "first_name" → firstName

Параметры кодирования

Настройте JSONEncoder.outputFormatting для форматирования вывода с отступами или сортировкой.

let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
let data = try encoder.encode(product)

Обработка необязательных полей

Помечайте свойства как необязательные, чтобы корректно обрабатывать отсутствующие ключи JSON без возникновения ошибок.

struct User: Codable {
  var name: String
  var bio: String?  // nil if "bio" key is absent from JSON
}

Быстрая проверка

Какая стратегия JSONDecoder автоматически сопоставляет ключи JSON в формате snake_case с именами свойств Swift в формате camelCase?

Итоги урока

Приводите типы к Codable для автоматического кодирования и декодирования JSON. Используйте CodingKeys для переименования свойств, keyDecodingStrategy = .convertFromSnakeCase для API с ключами в формате snake_case, пользовательский init(from:) для нестандартного JSON и dateDecodingStrategy для разбора дат.

Часто задаваемые вопросы

Урок «Codable: кодирование и декодирование JSON» бесплатный?

Да — полный текст урока «Codable: кодирование и декодирование JSON» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Codable: кодирование и декодирование JSON»?

Реализуйте Codable, пользовательские CodingKeys и декодирование вложенных контейнеров. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Codable: кодирование и декодирование JSON»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. URLSession data(from:) с async/await
  2. Codable: кодирование и декодирование JSON
  3. Обработка ошибок и коды состояния HTTP
  4. Логика повторных попыток и фоновый URLSession
← Назад к Swift Academy