JSON обработка в Swift: Codable, Foundation и SwiftyJSON для iOS/macOS

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

JSON обработка в Swift (iOS/macOS): полное руководство

JSON (JavaScript Object Notation) — один из самых популярных форматов обмена данными в современных приложениях. В экосистеме Apple (iOS, macOS, watchOS, tvOS) Swift предоставляет несколько мощных способов для работы с JSON. В этой статье мы разберём три основных подхода: нативный Codable, низкоуровневый JSONSerialization и популярную стороннюю библиотеку SwiftyJSON. Вы узнаете, как парсить, создавать и обрабатывать JSON в Swift с примерами кода.

1. Codable — современный стандарт Swift

Начиная с Swift 4, Apple представила протоколы Codable (объединяющий Encodable и Decodable). Это самый удобный и типобезопасный способ работы с JSON. Вам нужно лишь объявить структуру или класс, соответствующий Codable, и использовать JSONEncoder/JSONDecoder.

Пример: парсинг JSON из ответа API

import Foundation

// Определяем модель, автоматически соответствующую Codable
struct User: Codable {
    let id: Int
    let name: String
    let email: String
    let isActive: Bool
}

// Пример JSON-строки
let jsonString = """
{
    "id": 42,
    "name": "Иван Петров",
    "email": "ivan@example.com",
    "isActive": true
}
"""

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

Пример: создание JSON из объекта

let user = User(id: 1, name: "Анна Смирнова", email: "anna@test.com", isActive: false)
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted // для красивого форматирования

if let jsonData = try? encoder.encode(user),
   let jsonString = String(data: jsonData, encoding: .utf8) {
    print(jsonString)
}

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

struct Company: Codable {
    let name: String
    let employees: [User]
}

let companyJson = """
{
    "name": "TechCorp",
    "employees": [
        {"id": 1, "name": "Олег", "email": "oleg@tc.com", "isActive": true},
        {"id": 2, "name": "Мария", "email": "maria@tc.com", "isActive": false}
    ]
}
"""

if let data = companyJson.data(using: .utf8),
   let company = try? JSONDecoder().decode(Company.self, from: data) {
    print("Компания: \(company.name), сотрудников: \(company.employees.count)")
}

2. JSONSerialization — классический подход (Foundation)

До появления Codable основным инструментом был JSONSerialization из Foundation. Он работает со словарями и массивами Foundation ([String: Any] и [Any]). Этот метод полезен, когда структура JSON заранее неизвестна или сильно динамична.

Пример: парсинг с JSONSerialization

if let data = jsonString.data(using: .utf8) {
    do {
        if let dict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
            let id = dict["id"] as? Int ?? 0
            let name = dict["name"] as? String ?? "Неизвестно"
            print("ID: \(id), Имя: \(name)")
        }
    } catch {
        print("Ошибка: \(error)")
    }
}

Недостаток: отсутствие типобезопасности — нужно вручную приводить типы, что может привести к ошибкам времени выполнения. Рекомендуется использовать Codable везде, где это возможно.

3. SwiftyJSON — удобная сторонняя библиотека

SwiftyJSON — это популярная библиотека с открытым исходным кодом, которая упрощает работу с JSON, избавляя от необходимости писать множество проверок на nil и приводить типы вручную. Она особенно полезна при работе с глубоко вложенными структурами.

Установка через Swift Package Manager (SPM)

Добавьте в Package.swift или в Xcode: File → Add Packages → введите URL репозитория https://github.com/SwiftyJSON/SwiftyJSON.git.

Пример: работа со SwiftyJSON

import SwiftyJSON

let jsonString = """
{
    "user": {
        "profile": {
            "firstName": "Дмитрий",
            "age": 30,
            "address": {
                "city": "Москва",
                "street": "Тверская"
            }                    

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