← Назад к вопросам

Как работать с JSON в Swift?

1.0 Junior🔥 222 комментариев
#Работа с сетью#Язык Swift

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Работа с JSON в Swift

В Swift обработка JSON является фундаментальной задачей для взаимодействия с веб-сервисами и локальными данными. Основной подход основан на Codable протоколе, который сочетает Encodable и Decodable.

Основные методы

1. Использование Codable

Это самый распространённый и рекомендуемый способ. Он требует создания моделей (структур или классов), соответствующих структуре JSON.

struct User: Codable {
    var id: Int
    var name: String
    var email: String
}

// Декодирование JSON в объект
let jsonString = """
{
    "id": 1,
    "name": "Иван Петров",
    "email": "ivan@example.com"
}
"""

if let jsonData = jsonString.data(using: .utf8) {
    do {
        let user = try JSONDecoder().decode(User.self, from: jsonData)
        print("Пользователь: \(user.name)")
    } catch {
        print("Ошибка декодирования: \(error)")
    }
}

// Кодирование объекта в JSON
let newUser = User(id: 2, name: "Анна Сидорова", email: "anna@example.com")
do {
    let encodedData = try JSONEncoder().encode(newUser)
    let jsonString = String(data: encodedData, encoding: .utf8)
    print("JSON: \(jsonString ?? "")")
} catch {
    print("Ошибка кодирования: \(error)")
}

2. Работа с JSONSerialization (Foundation)

Более старый метод, полезный для динамических или неизвестных структур данных.

let jsonString = """
{
    "id": +100,
    "name": "Тестовый пользователь",
    "profile": {
        "age": 30,
        "city": "Москва"
    }
}
"""

if let data = jsonString.data(using: .utf8) {
    do {
        let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])
        if let dict = jsonObject as? [String: Any] {
            print("ID: \(dict["id"] ?? "N/A")")
            if let profile = dict["profile"] as? [String: Any] {
                print("Город: \(profile["city"] ?? "N/A")")
            }
        }
    } catch {
        print("Ошибка: \(error)")
    }
}

Практические особенности

Настройка процесса декодирования/кодирования

  • Ключи JSON: Используйте CodingKeys для соответствия ключей JSON и свойств модели, если они отличаются.
struct Product: Codable {
    var productId: Int
    var productName: String
    
    enum CodingKeys: String, CodingKey {
        case productId = "id"
        case productName = "title"
    }
}
  • Даты: JSONDecoder и JSONEncoder позволяют настроить формат даты.
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601 // или .custom {...}
  • Исключение значений: Используйте Optional для свойств, которые могут отсутствовать в JSON.

Работа с массивами и сложными структурами

struct ApiResponse: Codable {
    var status: String
    var data: [User]
    var meta: MetaInfo?
}

// Декодирование массива объектов
let usersJson = """
[
    {"id": 1, "name": "Первый"},
    {"id": 2, "name": "Второй"}
]
"""

if let data = usersJson.data(using: .utf8) {
    let users = try? JSONDecoder().decode([User].self, from: data)
}

Обработка ошибок и валидация

  • Всегда используйте do-try-catch блоки при работе с JSONDecoder/JSONEncoder.
  • Для сложной валидации можно использовать дополнительные проверки в init(from decoder: Decoder).

Современные альтернативы

  • Для очень больших JSON потоков рассмотрите JSONStream или Combine для постепенной обработки.
  • Популярные библиотеки вроде SwiftyJSON (хотя с Codable их использование стало менее необходимым).

Рекомендации

  1. Codable — основной инструмент для типизированной работы.
  2. JSONSerialization — для случаев когда структура данных заранее неизвестна или сильно динамична.
  3. Внимательно обрабатывайте опциональные значения и типы данных.
  4. Тестируйте декодирование на краевых случаях (пустые значения, null, неожиданные типы).

Таким образом, работа с JSON в Swift стала значительно проще с появлением Codable, но важно понимать и альтернативные методы для различных сценариев разработки.

Как работать с JSON в Swift? | PrepBro