Декодирование с помощью 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 — локальная установка не требуется.
Все уроки этого курса
- Соответствие Codable
- Кодирование с помощью JSONEncoder
- Декодирование с помощью JSONDecoder
- Работа с необязательными и вложенными типами