Swift: преобразование структуры в JSON – методы и примеры

В Swift преобразование структуры в JSON — обычная задача при работе с веб-сервисами или при сохранении данных. К счастью, Swift предоставляет несколько методов и API для облегчения этого преобразования. В этой статье мы рассмотрим различные подходы к преобразованию структуры в JSON на примерах кода.

Метод 1: Codable протокол с JSONEncoder
Протокол Codable, представленный в Swift 4, упрощает процесс преобразования между типами Swift и внешними представлениями, такими как JSON. Вот пример:

struct Person: Codable {
    let name: String
    let age: Int
}
let person = Person(name: "John Doe", age: 30)
do {
    let jsonEncoder = JSONEncoder()
    let jsonData = try jsonEncoder.encode(person)
    let jsonString = String(data: jsonData, encoding: .utf8)
    print(jsonString ?? "")
} catch {
    print("Error encoding struct to JSON: \(error)")
}

Метод 2: ручная сериализация с помощью JSONSerialization
Если ваша структура не соответствует протоколу Codable, вы можете сериализовать ее вручную с помощью класса JSONSerialization. Вот пример:

struct Person {
    let name: String
    let age: Int
    func toJSON() -> [String: Any] {
        return ["name": name, "age": age]
    }
}
let person = Person(name: "John Doe", age: 30)
do {
    let json = try JSONSerialization.data(withJSONObject: person.toJSON(), options: .prettyPrinted)
    let jsonString = String(data: json, encoding: .utf8)
    print(jsonString ?? "")
} catch {
    print("Error converting struct to JSON: \(error)")
}

Метод 3: пользовательское перечисление CodingKeys
Если имена свойств вашей структуры отличаются от имен ключей JSON, вы можете использовать пользовательское перечисление CodingKeysдля указания сопоставления. Вот пример:

struct Person: Codable {
    let fullName: String
    let yearsOld: Int
    enum CodingKeys: String, CodingKey {
        case fullName = "name"
        case yearsOld = "age"
    }
}
let person = Person(fullName: "John Doe", yearsOld: 30)
do {
    let jsonEncoder = JSONEncoder()
    let jsonData = try jsonEncoder.encode(person)
    let jsonString = String(data: jsonData, encoding: .utf8)
    print(jsonString ?? "")
} catch {
    print("Error encoding struct to JSON: \(error)")
}

В этой статье мы рассмотрели различные методы преобразования структуры в JSON в Swift. Протокол Codable с JSONEncoder обеспечивает удобный способ сериализации, а JSONSerialization позволяет сериализовать вручную. Кроме того, использование пользовательского перечисления CodingKeys позволяет сопоставлять свойства структуры с различными ключами JSON. Эти методы дают вам гибкость в обработке преобразований структур в JSON в зависимости от ваших конкретных требований.

Используя эти методы, вы можете легко интегрировать свой код Swift с API-интерфейсами на основе JSON и системами хранения данных.