0Pricing
Swift Academy · Урок

Декодирование с помощью JSONDecoder

Преобразуйте данные JSON в типизированные значения Swift.

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

Создание JSONDecoder

JSONDecoder восстанавливает значение Swift из JSON Data. Укажите ему тип результата и передайте байты.

import Foundation

struct City: Codable {
    var name: String
    var population: Int
}

let json = "{\"name\":\"Oslo\",\"population\":700000}"
let data = json.data(using: .utf8)!
let city = try JSONDecoder().decode(City.self, from: data)
print(city.name, city.population)

Передача типа с помощью .self

Первый аргумент — это метатип, записываемый как MyType.self. Так декодировщик понимает, какую структуру нужно построить из данных.

import Foundation

struct Flag: Codable { var ok: Bool }

let data = "{\"ok\":true}".data(using: .utf8)!
let result = try JSONDecoder().decode(Flag.self, from: data)
print(result.ok)

Декодирование массивов

Чтобы декодировать массив JSON, запросите тип массива, например [Int].self или [MyStruct].self.

import Foundation

let json = "[10, 20, 30]"
let data = json.data(using: .utf8)!
let numbers = try JSONDecoder().decode([Int].self, from: data)
print(numbers.reduce(0, +))

Декодирование вложенных объектов

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

import Foundation

struct Coord: Codable { var lat: Double; var lon: Double }
struct Place: Codable { var name: String; var coord: Coord }

let json = "{\"name\":\"X\",\"coord\":{\"lat\":1.0,\"lon\":2.0}}"
let p = try JSONDecoder().decode(Place.self, from: json.data(using: .utf8)!)
print(p.coord.lat, p.coord.lon)

Перехват ошибок декодирования

decode вызывает исключение, если данные не соответствуют типу. Оберните вызов в do/catch, чтобы корректно обработать некорректные входные данные.

import Foundation

struct User: Codable { var name: String }

let bad = "{\"wrong\":1}".data(using: .utf8)!
do {
    let u = try JSONDecoder().decode(User.self, from: bad)
    print(u.name)
} catch {
    print("Failed:", error)
}

Ошибки keyNotFound

Распространённая ошибка — DecodingError.keyNotFound. Она возникает, когда отсутствует обязательный ключ. Сопоставьте ошибку с образцом, чтобы точно сообщить, что пошло не так.

import Foundation

struct User: Codable { var name: String }

let bad = "{}".data(using: .utf8)!
do {
    _ = try JSONDecoder().decode(User.self, from: bad)
} catch let DecodingError.keyNotFound(key, _) {
    print("Missing key:", key.stringValue)
} catch {
    print("Other error:", error)
}

Ошибки typeMismatch

Если значение имеет неправильный тип JSON — например, вместо ожидаемого Int получена строка, — декодировщик вызывает DecodingError.typeMismatch.

import Foundation

struct Count: Codable { var n: Int }

let bad = "{\"n\":\"oops\"}".data(using: .utf8)!
do {
    _ = try JSONDecoder().decode(Count.self, from: bad)
} catch let DecodingError.typeMismatch(type, _) {
    print("Type mismatch, expected:", type)
} catch {
    print("Other:", error)
}

Ошибки dataCorrupted

Недопустимый синтаксис JSON вызывает DecodingError.dataCorrupted. Обычно это означает, что байты вообще не являются корректным JSON.

import Foundation

struct User: Codable { var name: String }

let bad = "not json".data(using: .utf8)!
do {
    _ = try JSONDecoder().decode(User.self, from: bad)
} catch is DecodingError {
    print("Decoding failed: data corrupted")
} catch {
    print("Other:", error)
}

Декодирование в опциональные значения

Если свойство является опциональным, отсутствующий ключ декодируется в nil без исключения. Благодаря этому опциональные поля допускают отсутствие данных.

import Foundation

struct Profile: Codable {
    var name: String
    var bio: String?
}

let json = "{\"name\":\"Kai\"}"
let p = try JSONDecoder().decode(Profile.self, from: json.data(using: .utf8)!)
print(p.name, p.bio ?? "no bio")

Повторное использование декодировщика

Как и кодировщик, настроенный JSONDecoder можно повторно использовать для множества наборов данных. Храните один экземпляр и декодируйте с его помощью разные входные данные.

import Foundation

struct Word: Codable { var text: String }

let decoder = JSONDecoder()
let inputs = ["{\"text\":\"hi\"}", "{\"text\":\"bye\"}"]
for s in inputs {
    let w = try decoder.decode(Word.self, from: s.data(using: .utf8)!)
    print(w.text)
}

Декодируйте, проверьте, используйте

Полный процесс выглядит так: получите Data, декодируйте их в типизированное значение внутри do/catch, а затем безопасно используйте результат со строгой типизацией.

import Foundation

struct Weather: Codable {
    var city: String
    var temp: Double
}

let json = "{\"city\":\"Rome\",\"temp\":21.5}"
do {
    let w = try JSONDecoder().decode(Weather.self, from: json.data(using: .utf8)!)
    print("\(w.city): \(w.temp)C")
} catch {
    print("Decode error:", error)
}

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

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

Повторение: декодирование с помощью JSONDecoder

Вы научились восстанавливать значения Swift из JSON:

  • decode(MyType.self, from: data) создаёт типизированное значение.
  • Массивы, вложенные объекты и опциональные значения декодируются автоматически.
  • decode вызывает варианты ошибки DecodingError: keyNotFound, typeMismatch, dataCorrupted, valueNotFound.
  • Оберните вызовы в do/catch, чтобы обрабатывать некорректные входные данные.

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

Урок «Декодирование с помощью JSONDecoder» бесплатный?

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

Чему я научусь в уроке «Декодирование с помощью JSONDecoder»?

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

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

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

Сколько времени занимает урок «Декодирование с помощью JSONDecoder»?

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

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

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

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

  1. Соответствие Codable
  2. Кодирование с помощью JSONEncoder
  3. Декодирование с помощью JSONDecoder
  4. Работа с необязательными и вложенными типами
← Назад к Swift Academy