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": "Тверская"
}