logo
GeekFormat

JSON в Swift

Бесплатный онлайн инструмент JSON в Swift, одним щелчком преобразует ответы API, файлы конфигурации или журналы JSON в чистые объявления типов Swift struct / class. Без регистрации, без загрузки, генерация в реальном времени в локальном браузере, подходит для быстрого моделирования в проектах iOS, macOS, watchOS и tvOS.

Похожие

О JSON в Swift: преобразование данных JSON в нативные типы экосистемы Apple

JSON в Swift - это процесс автоматического преобразования данных в формате JSON (объектов или массивов) в объявления типов Swift struct / class. JSON - это фактический стандарт REST API, файлов конфигурации, журналов событий, а Swift - основной язык разработки приложений iOS, macOS, watchOS, tvOS, а также основной язык серверных фреймворков, таких как Vapor. В разработке часто нужно записывать JSON, возвращаемый API, в соответствующие типы Swift, ручное написание не только отнимает время, но и легко пропустить опциональные поля, роль этого инструмента - автоматизировать этот процесс.

Этот инструмент использует quicktype-core для завершения преобразования локально в браузере. quicktype - это многопоточный генератор структур с поддержкой многих языков, этот инструмент включает опции just-types и no-comments для Swift, поэтому вывод представляет собой чистые объявления свойств struct / class, не содержащие аннотаций сериализации Codable, Decodable, Encodable, а также операторов import или комментариев заголовка файла. Этот «голый тип» позволяет разработчикам свободно добавлять протоколы, настраивать контроль доступа в соответствии с потребностями проекта или изменять на соглашения об именовании, предпочитаемые сетевыми фреймворками, такими как Alamofire / Moya.

Система типов Swift известна своей безопасностью. struct - это тип значения, подходящий для представления неизменяемых моделей данных; class - это ссылочный тип, подходящий для сценариев, требующих общего состояния или наследования. Свойства, генерируемые этим инструментом, по возможности сопоставляются с String, Int, Double, Bool, [T], пользовательскими типами Swift и т.д. Разработчики могут после генерации изменить определенные поля на Optional (?) в соответствии с бизнес-потребностями, добавить протокол Codable к типам или обновить весь struct до class для получения ссылочной семантики.

Обработка вложенных объектов - ключевая возможность инструмента. Когда JSON содержит вложенные объекты, инструмент рекурсивно генерирует независимые подтипы, например, когда Root содержит объект address, будет сгенерирован тип Address, на который ссылается var address: Address в основном типе. Это позволяет избежать повторного определения типов и позволяет автодополнению и проверке типов Xcode правильно отслеживать иерархические отношения. Правило именования использует заглавную букву имени поля, например элементы в массиве users будут названы User.

Вывод типов массивов следует стратегии «вывод по первому элементу». Если элементы массива - строки, генерируется [String], целые числа - [Int], числа с плавающей точкой - [Double], объекты - [пользовательский тип]. Пустые массивы [] из-за отсутствия выборки генерируют [Any] или резервный тип, после генерации рекомендуется изменить на конкретный тип в соответствии с реальным бизнесом. Для особенно больших или разреженных массивов рекомендуется поместить реальные элементы выборки в исходный JSON для повышения точности вывода.

Чистая фронтенд-обработка - основное архитектурное преимущество этого инструмента. Весь анализ JSON и генерация кода Swift выполняются в JavaScript браузера (включая quicktype-core в Web Worker), не зависит от бэкенд-сервисов и не отправляет данные на какие-либо серверы. Эта конструкция не только защищает данные JSON, которые могут содержать конфиденциальную информацию, но и гарантирует, что скорость преобразования ограничена только производительностью локального устройства, без ожидания сетевых обращений. Особенно важно при обработке JSON, содержащего API-ключи, неопубликованные бизнес-поля.

Этот инструмент отличается от некоторых онлайн-инструментов, которые принудительно связывают стратегии декодирования Codable / CodingKeys / Date: члены команды разработки часто имеют разные предпочтения относительно протоколов, именования, контроля доступа, этот инструмент придерживается принципа минимального вывода, оставляя выбор протоколов и стратегий разработчикам для доработки по потребностям проекта. Этот рабочий процесс «генерация полуфабриката + проектная доработка» в средних и крупных командах обычно более популярен у инженеров, чем «все в одном».

Варианты использования

  • Разработка iOS: преобразование JSON, возвращаемого бэкенд REST API, в Swift struct для моделирования сетевого слоя SwiftUI или UIKit и декодирования JSONDecoder
  • Разработка macOS: преобразование конфигурационного JSON приложения в типы Swift, типобезопасное чтение конфигурации в проектах AppKit, избегание ошибок правописания
  • Разработка watchOS: преобразование JSON данных здоровья и физической активности для приложений Apple Watch в модели Swift и интеграция со SwiftUI и HealthKit
  • Разработка tvOS: преобразование JSON интерфейса рекомендаций контента в типы Swift для отображения данных главной страницы телевизионных приложений и навигации по фокусу
  • Моделирование SwiftUI MVVM: привязка моделей данных API напрямую как свойств @Published к ViewModel, затем управление представлениями интерфейса
  • Реактивный поток данных Combine: использование типов ответов JSON в качестве выходных типов Publisher в сочетании с JSONDecoder для реактивного парсинга
  • Предварительное моделирование SwiftData / Core Data: сначала создайте Swift struct, затем вручную добавьте аннотации @Model или @NSManaged для сопоставления сущностей
  • Интеграция со сторонними SDK: преобразование примеров ответов JSON из документации SDK в типы Swift для быстрой интеграции SDK входа, оплаты, push-уведомлений, карт и т.д.
  • Подготовка модульных тестов: преобразование mock JSON интерфейса в типы Swift для использования в тестовых данных и утверждениях XCTest, повышение поддерживаемости тестов
  • Ревью кода: преобразование JSON ответов API в типы Swift для удобства обсуждения именования полей и опциональности при командном Code Review
  • Кроссплатформенная разработка Flutter / React Native: подготовка моделей данных для вызова нативных модулей Swift, уменьшение ошибок преобразования типов на уровне bridge
  • Миграция бэкенд-интерфейсов: создание клиентских моделей Swift из документации REST интерфейсов или примеров Postman JSON для быстрой синхронизации при обновлении версий
  • Обучение и подготовка: демонстрация сопоставления JSON с системой типов в курсах Swift / iOS, помощь студентам в понимании моделирования данных API и типобезопасности
  • Приложения здоровья и фитнеса: преобразование JSON, возвращаемого интерфейсами HealthKit / Fitbit, в типы Swift для моделирования данных Apple Health
  • Платежные и финансовые приложения: преобразование JSON ответов интерфейсов платежных шлюзов в модели Swift для удобства сверки и обработки исключений
  • Системы заказов электронной коммерции: преобразование JSON заказов, товаров, адресов в Swift struct в сочетании со списками SwiftUI и страницами деталей для отображения
  • Новостные и контентные приложения: преобразование JSON ответов систем управления контентом в типы Swift для TableView / списков SwiftUI / страниц деталей
  • Серверная разработка Vapor: преобразование JSON запросов/ответов бэкенд API в структуры Swift для определения серверных моделей и кодирования/декодирования Codable
  • MapKit и геоданные: преобразование JSON, возвращаемого картографическими интерфейсами, в Swift struct для моделирования результатов поиска мест, планирования маршрутов, геокодирования

Как использовать

  1. Вставьте содержимое JSON в левый редактор или нажмите кнопку загрузки, чтобы выбрать файл .json / .txt, также можно загрузить встроенные примеры данных
  2. Инструмент автоматически вызовет quicktype-core для преобразования через 400 мс после задержки, справа отобразится сгенерированный код Swift struct / class
  3. Если JSON имеет ошибки формата, нажмите кнопку「Исправить JSON」для автоматического исправления распространенных синтаксических проблем (завершающие запятые, одинарные кавычки, отсутствующие кавычки и т.д.)
  4. Проверьте сгенерированный результат, можно вручную добавить протоколы Codable / Equatable / Identifiable в соответствии с потребностями проекта; нажмите「Копировать」для вставки в Xcode или нажмите「Загрузить」для сохранения как файл .swift

Функции

  • Чисто локальное преобразование в браузере: анализ JSON и генерация кода Swift полностью выполняются в браузере через quicktype-core, исходный JSON и сгенерированный код не загружаются на какие-либо серверы
  • Режим quicktype-core just-types: вывод представляет собой чистые объявления свойств Swift struct / class, без import, без аннотаций Codable / CodingKeys, удобно для доработки по потребностям проекта
  • Автоматическое преобразование с задержкой 400ms: почти мгновенная генерация типов Swift после вставки или изменения JSON, не нужно многократно нажимать кнопку преобразования, процесс полностью асинхронный и не блокирует UI
  • Фоновое выполнение Web Worker: quicktype-core работает в Web Worker браузера, избегая зависания основного потока и задержек редактирования при преобразовании больших JSON
  • Умный вывод типов: автоматическое сопоставление String, Int, Double, Bool, [T], пользовательских типов, массивы выводятся по типу первого элемента, не нужно вручную писать типы полей
  • Автоматическое разворачивание вложенных объектов: рекурсивно генерирует независимые типы Swift для каждого вложенного объекта, имена с заглавной буквы по имени поля, избегая повторного определения типов
  • Автоматический вывод типов массивов: массивы JSON автоматически преобразуются в [String] / [Int] / [Double] / [пользовательский тип], пустые массивы по умолчанию генерируют [Any]
  • Исправление ошибок JSON одним щелчком: при обнаружении распространенных ошибок форматирования, таких как завершающие запятые, одинарные кавычки, отсутствующие кавычки, комментарии, можно автоматически исправить одним щелчком и продолжить преобразование
  • Копирование одним щелчком + загрузка .swift: скопируйте сгенерированный код Swift в буфер обмена одним щелчком или загрузите как файл .swift для перетаскивания непосредственно в проект Xcode
  • Примеры данных + загрузка файлов: встроенный пример JSON в стиле Swift (включая вложенные address / company / tags), поддержка перетаскивания или нажатия для загрузки файлов .json / .txt
  • История ввода localStorage: автоматическое сохранение последних вводов, быстрое восстановление для продолжения редактирования после обновления или случайного закрытия страницы, не беспокойтесь о потере содержимого
  • Адаптивный редактор с разделенным экраном: предварительный просмотр в реальном времени с разделением экрана слева и справа, адаптивный для настольных и мобильных устройств, плавная работа даже на маленьких экранах

Примеры кода

Swift: Парсинг сгенерированного struct с помощью URLSession + JSONDecoder

swift

Наиболее распространенное использование в проектах iOS / macOS: добавьте Codable к struct, сгенерированному этим инструментом, затем используйте URLSession для асинхронной выборки и декодирования с помощью JSONDecoder.

import Foundation

// 1) Корневой тип, сгенерированный этим инструментом (дополнен протоколом Codable)
struct User: Codable {
    let id: Int
    let name: String
    let email: String
    let isActive: Bool
    let tags: [String]
}

// 2) Асинхронное получение и декодирование URLSession
func fetchUser(id: Int) async throws -> User {
    let url = URL(string: "https://api.example.com/users/\(id)")!
    let (data, response) = try await URLSession.shared.data(from: url)
    guard
        let http = response as? HTTPURLResponse,
        (200..<300).contains(http.statusCode)
    else {
        throw URLError(.badServerResponse)
    }
    return try JSONDecoder().decode(User.self, from: data)
}

// 3) Пример использования (Swift 5.5+ async/await)
Task {
    do {
        let user = try await fetchUser(id: 42)
        print("User: \(user.name), tags: \(user.tags)")
    } catch {
        print("Failed to decode:", error)
    }
}

Swift: Десериализация сгенерированного типа с помощью Alamofire responseDecodable

swift

При использовании Alamofire можно напрямую использовать responseDecodable для автоматического декодирования struct, сгенерированного этим инструментом, в объект Swift.

import Foundation
import Alamofire

// Тип, сгенерированный этим инструментом, после добавления Codable можно использовать напрямую
struct Product: Codable {
    let id: Int
    let title: String
    let price: Double
    let inStock: Bool
    let images: [String]
}

final class ProductService {
    private let session: Session

    init(session: Session = .default) {
        self.session = session
    }

    /// Alamofire 5 async/await стиль responseDecodable
    func loadProduct(id: Int) async throws -> Product {
        let url = "https://api.example.com/products/\(id)"
        return try await withCheckedThrowingContinuation { continuation in
            session.request(url)
                .validate(statusCode: 200..<300)
                .responseDecodable(of: Product.self) { response in
                    switch response.result {
                    case .success(let product):
                        continuation.resume(returning: product)
                    case .failure(let error):
                        continuation.resume(throwing: error)
                    }
                }
        }
    }
}

// Пример вызова в стиле Moya
// provider.request(.product(id: 1)).map(Product.self)
// let product: Product = try await provider.request(.product(id: 1)).map(Product.self)

Swift: Реактивный парсинг с помощью Combine + JSONDecoder

swift

В проектах SwiftUI / Combine можно использовать сгенерированный struct вместе с dataTaskPublisher / decode для создания реактивных потоков данных.

import Foundation
import Combine

// Корневой тип, сгенерированный этим инструментом
struct Article: Codable, Identifiable {
    let id: Int
    let title: String
    let body: String
    let publishedAt: Date
}

final class ArticleRepository {
    private let session: URLSession
    private var cancellables = Set<AnyCancellable>()

    init(session: URLSession = .shared) {
        self.session = session
    }

    /// Предоставление потока данных с помощью Combine
    func articlePublisher(id: Int) -> AnyPublisher<Article, Error> {
        let url = URL(string: "https://api.example.com/articles/\(id)")!
        let decoder = JSONDecoder()
        decoder.dateDecodingStrategy = .iso8601

        return session.dataTaskPublisher(for: url)
            .map(\.data)
            .decode(type: Article.self, decoder: decoder)
            .receive(on: DispatchQueue.main)
            .eraseToAnyPublisher()
    }

    /// Подписка в SwiftUI ViewModel
    func bind(to viewModel: ArticleViewModel, articleId: Int) {
        articlePublisher(id: articleId)
            .sink(
                receiveCompletion: { completion in
                    if case .failure(let err) = completion {
                        viewModel.errorMessage = err.localizedDescription
                    }
                },
                receiveValue: { article in
                    viewModel.article = article
                }
            )
            .store(in: &cancellables)
    }
}

final class ArticleViewModel: ObservableObject {
    @Published var article: Article?
    @Published var errorMessage: String?
}

Best Practices

Часто задаваемые вопросы

Как преобразовать JSON в структуру Swift?

Вставьте содержимое JSON в левое поле ввода, инструмент автоматически вызовет quicktype-core для преобразования в код Swift через 400 мс после задержки и отобразит результат в реальном времени на правой панели. Вы также можете нажать кнопку загрузки, чтобы выбрать файл .json / .txt, или нажать кнопку примера для загрузки встроенных данных. После завершения преобразования можно скопировать одним щелчком или загрузить как файл .swift.

Содержит ли сгенерированный код Swift Codable?

По умолчанию не содержит. Этот инструмент использует режим just-types от quicktype-core, вывод представляет собой чистые объявления свойств struct / class, без аннотаций Codable, Decodable или Encodable, а также без операторов import. Если вам нужен Codable, просто добавьте : Codable вручную после генерации (например struct User: Codable {}), или напишите собственную логику парсинга JSONDecoder.

Какие структуры данных JSON поддерживаются?

Поддерживаются все допустимые JSON: базовые типы (null, boolean, number, string), одномерные или многомерные массивы, вложенные объекты любой глубины. Корневой ввод может быть объектом JSON или массивом JSON, инструмент обрабатывает с приоритетом объектов, массивы выводятся по первому элементу. Неподдерживаемые вводы включают специальные значения JavaScript (функции, Symbol, undefined) и текст, не являющийся JSON.

Как обрабатываются вложенные объекты JSON?

Инструмент рекурсивно генерирует независимые типы Swift для каждого вложенного объекта. Правила именования основаны на комбинации имени родительского типа и имени поля, например, когда Root содержит поле address, будет сгенерирован подтип Address, на который ссылается var address: Address в основном типе. Это позволяет избежать повторного определения типов и позволяет автодополнению и проверке типов Xcode правильно отслеживать иерархические отношения.

Будут ли поля массивов преобразованы в массивы Swift?

Да. Массивы JSON автоматически преобразуются в форму [T] Swift. Если элементы массива - строки, генерируется [String], целые числа - [Int], числа с плавающей точкой - [Double], объекты - [пользовательский тип]. Пустые массивы [] из-за отсутствия элементов выборки по умолчанию генерируют [Any], рекомендуется вручную изменить на [String] или [Int] и другие конкретные типы после генерации.

Какой тип генерируется для полей со значением null?

Значение null в JSON не может вывести конкретный тип, инструмент может сгенерировать Any или резервный тип. Рекомендуется заменить поля со значением null в исходном JSON на примеры значений (например "field": "" выводится как String) или вручную изменить на Optional в соответствии с бизнес-логикой (например var phone: String?), что больше соответствует безопасной семантике системы типов Swift.

Можно ли настроить имя генерируемой структуры?

Да. Нажмите кнопку имени типа на панели инструментов (или вход в настройки), чтобы изменить имя корневого типа (по умолчанию Root или выводится по примеру данных). Имена подтипов автоматически генерируются на основе корневого имени и имени поля, правило именования - заглавная буква имени поля, например users → User, tags → Tag.

Что делать при ошибке формата JSON?

Инструмент автоматически проверит допустимость JSON, при ошибке отобразит конкретное сообщение об ошибке справа и предоставит кнопку「Исправить JSON」. После нажатия можно автоматически исправить распространенные ошибки: лишние запятые в конце, замена одинарных кавычек двойными, дополнение ключей с отсутствующими кавычками, удаление комментариев и т.д. После успешного исправления можно продолжить преобразование, не нужно вручную исправлять JSON.

Будут ли данные загружены на сервер? Безопасна ли конфиденциальность?

Полностью локальная работа в браузере. Весь анализ JSON и генерация кода Swift выполняются локально через JavaScript браузера (включая quicktype-core в Web Worker), введенные данные JSON и сгенерированный код Swift не загружаются на какие-либо серверы, не записываются и не кэшируются в облаке. Конфиденциальные JSON, содержащие API key, токены, личные поля пользователей, неопубликованные бизнес-структуры, можно использовать с уверенностью, при закрытии страницы данные удаляются.

Можно ли сгенерированный код напрямую использовать в проекте Xcode?

Да. Сгенерированный код - это стандартный синтаксис Swift, его можно напрямую скопировать в файл .swift в Xcode или сохранить как файл .swift через кнопку「Загрузить」для перетаскивания в проект. Поскольку вывод представляет собой чистые объявления типов, рекомендуется вручную добавить протоколы Codable, Equatable, Identifiable в соответствии с потребностями проекта или настроить модификаторы доступа (public / internal / private).

Поддерживаются ли массивы JSON в качестве корневого ввода?

Поддерживаются. Когда корневой ввод - массив JSON, инструмент использует первый элемент массива в качестве шаблона для генерации типа элемента и выводит определение этого типа элемента. Например [{"id":1,"name":"A"}] сгенерирует struct с именем Item (или имя, выведенное по полям), его поля - это поля первого элемента; основной тип ссылается через свойство items: [Item], избегая прямого рассмотрения массива как корневого типа.

Будет ли тормозить преобразование больших JSON?

У инструмента нет явных ограничений размера, но браузер будет замедляться при разборе и отображении очень больших JSON. Рекомендации: ① Преобразуйте JSON только одного бизнес-модуля за раз; ② При слишком глубокой вложенности разделяйте уровни для обработки; ③ JSON размером более нескольких МБ можно обрабатывать с помощью командной строки quicktype; ④ Разделение одного и того же JSON на несколько подмодулей для отдельного преобразования может значительно снизить потребление памяти.

Можно ли взаимозаменять JSON в Swift и JSON в TypeScript?

Оба преобразуют JSON в определения типов соответствующего языка, но акценты различаются: JSON в Swift генерирует объявления свойств struct / class для нативных приложений iOS / macOS; JSON в TypeScript генерирует объявления interface / type для проверки типов интерфейса. Если в вашем проекте одновременно есть клиент iOS и веб-интерфейс, рекомендуется сгенерировать две версии Swift и TS для одного и того же JSON отдельно, чтобы обеспечить согласованность типов на обеих сторонах.

Как добавить протокол Codable в сгенерированный код?

Этот инструмент по умолчанию выводит чистые типы, не несет протоколы напрямую. После генерации вам просто нужно добавить : Codable после объявления struct/class, например struct User: Codable {}, чтобы JSONDecoder мог использовать. Если вы хотите, чтобы по умолчанию был Codable, вы можете форкнуть quicktype-core и изменить его рендерер Swift, или использовать функцию пакетной замены Xcode после генерации, чтобы добавить протоколы ко всем типам.

Требуется ли подключение к Интернету? Можно ли использовать на мобильных устройствах?

При первом посещении страницы требуется подключение к Интернету для загрузки скриптов инструмента и ресурсов quicktype-core, после чего можно работать в автономном режиме в кэше браузера (в уже посещенном браузере). Мобильные браузеры (iOS Safari, Android Chrome) также могут нормально использовать, интерфейс - адаптивный дизайн с разделенным экраном, при вертикальной ориентации автоматически переключается на вертикальное расположение.

Поддерживается ли отдельное изменение определенного типа после генерации без нарушения других типов?

Поддерживается. После генерации каждый тип Swift является независимым struct / class, вывод инструмента - обычный текст, вы можете отдельно скопировать определенный тип и вставить в Xcode, или использовать рефакторинг Rename в Xcode для пакетного изменения типов и полей, не влияя на другие типы. Если нужно перегенерировать всю группу типов, обновите страницу и снова вставьте JSON.

Поддерживается ли вывод перечислений Swift enum?

Поддержка union/enum в quicktype требует дополнительных type hints или ввода GraphQL/JSON Schema. Только на основе выборки JSON сложно вывести перечисления, поэтому этот инструмент по умолчанию не генерирует enum. Если вам нужны перечисления, вы можете вручную изменить соответствующий struct на enum + Codable, или использовать инструмент JSON в Kotlin / TypeScript сначала для получения типа enum, а затем вручную перенести в Swift.

Устранение неполадок

Сообщение «Пожалуйста, введите данные JSON» или правая сторона пуста

Левое поле ввода пусто или содержит только пробельные символы. Пожалуйста, вставьте допустимое содержимое JSON, или нажмите「Пример」для загрузки образца, или нажмите「Загрузить」для выбора файла .json / .txt.

Сообщение «Unexpected token ... in JSON»

JSON имеет недопустимый формат. Распространенные причины: ① Лишняя запятая в конце (например {"a":1,}); ② Использованы одинарные кавычки вместо двойных; ③ Запись объекта JS (например {key: value}) вместо JSON (например {"key": "value"}); ④ Содержит комментарии JavaScript. Нажатие кнопки「Исправить JSON」может автоматически исправить часть распространенных ошибок.

Сгенерированный тип не имеет Codable, невозможно напрямую использовать JSONDecoder

Это ожидаемое поведение. Этот инструмент использует режим just-types, выводит чистые объявления свойств struct / class. Если нужен Codable, пожалуйста, после генерации добавьте : Codable к типу (например struct User: Codable {}), или напишите extension User: Codable {} перед вызовом JSONDecoder.

Пустые массивы [] сгенерировали [Any]

Пустые массивы не имеют элементов выборки, инструмент сгенерирует резервный тип [Any]. Рекомендуется поместить хотя бы один элемент примера в исходный JSON (например [1, 2]), после генерации удалите пример значения и вручную укажите конкретный тип; или после генерации напрямую измените на [String] / [User] и другие более точные типы.

Тип поля со значением null не определен

JSON null не может вывести конкретный тип, инструмент может сгенерировать Any или резервный тип. Рекомендуется заменить null в исходном JSON на репрезентативное значение примера (например "" или 0), после генерации измените это поле на Optional (?) или конкретный тип, например var phone: String?.

Сгенерированное имя типа не соответствует нормам проекта

Можно изменить имя корневого типа на панели инструментов, имена подтипов автоматически генерируются на основе корневого имени + имени поля. Если все еще не удовлетворены, после генерации используйте рефакторинг Rename в Xcode для пакетного изменения (правая кнопка → Refactor → Rename), Xcode синхронно обновит все ссылки.

После преобразования большого JSON страница зависает

Браузер замедляется при рендеринге очень больших JSON и генерации множества типов. Рекомендуется разделять JSON на несколько независимых бизнес-модулей для отдельного преобразования или извлекать только ключевые объекты, нуждающиеся в моделировании, для преобразования; JSON размером более 10 МБ рекомендуется обрабатывать с помощью командной строки quicktype.

Ошибка компиляции Xcode «Type 'X' does not conform to protocol 'Decodable'»

Указывает, что после добавления Codable к некоторым полям вы неправильно обработали типы, такие как Optional / Date / Enum. Распространенные исправления: ① Измените все поля, которые могут быть null, на Optional<T>; ② Пользовательская стратегия дат JSONDecoder().dateDecodingStrategy = .iso8601; ③ Пользовательские CodingKeys для согласования ключей JSON с именами свойств Swift.

Имена полей в snake_case, в Swift принято camelCase

Этот инструмент по умолчанию сохраняет исходные имена полей JSON, поэтому поля snake_case генерируются как есть. Если хотите унифицировать в camelCase, можно после генерации использовать Xcode Rename для пакетного переименования или в пользовательском рендерере quicktype преобразовать имена полей в camelCase, затем дополнить отображение CodingKeys, обеспечив правильное декодирование JSON.

Загруженный файл .swift, открытый в Xcode, выдает ошибку с китайскими ключами

Swift рекомендует имена полей в виде английских ASCII-идентификаторов. Если исходный JSON содержит китайские ключи (например {"имя": "Alice"}), сгенерированное var имя: String вызовет ошибку компилятора Swift в некоторых исторических версиях. Рекомендуется в исходном JSON изменить ключи на английские (например name), что больше соответствует нормам кодирования Swift.

Типы имеют только var, нет управления let / private

Этот инструмент по умолчанию генерирует свойства var public, удобные для доработки после генерации. Если нужен let или контроль доступа (например private(set)), можно использовать Refactor → Add Access Control в Xcode для пакетного изменения или после генерации использовать sed / инструменты текстового редактирования для замены var на let.

JSON содержит строку даты ISO 8601, декодирование поля Date завершилось ошибкой

Этот инструмент по умолчанию отображает строки ISO 8601 как String, Swift не будет автоматически преобразовывать в Date. Требуется установить dateDecodingStrategy в JSONDecoder, например JSONDecoder().dateDecodingStrategy = .iso8601. Если формат даты нестандартный, также нужно вручную реализовать DateFormatter или пользовательскую логику парсинга.

Слишком глубокая вложенность, конфликт имен

Инструмент использует «заглавная буква имени поля» для именования подтипов. В глубоко вложенных JSON могут появиться одноименные вложенные объекты, приводящие к конфликтам типов. Методы решения: ① Добавить бизнес-префиксы к полям в исходном JSON; ② Разделить корневой JSON на несколько независимых модулей для отдельной генерации; ③ После генерации использовать Xcode Rename для пакетного изменения конфликтующих имен типов.

Сгенерирован public struct, но проект использует изоляцию модулей

Этот инструмент по умолчанию генерирует internal struct, без явного модификатора public. Если проект разделен по модулям и требуется доступ между модулями, нужно в Xcode пакетно заменить struct на public struct или после генерации использовать скрипты sed/awk для единообразного добавления ключевого слова public.

Глоссарий

struct
Тип значения в Swift. По умолчанию подходит для представления неизменяемых моделей данных, при присваивании копируется. Этот инструмент по умолчанию генерирует struct для представления объектов JSON.
class
Ссылочный тип в Swift. Подходит для сценариев, требующих общего состояния, наследования или идентичности (===). Этот инструмент может генерировать class при определенных конфигурациях.
Optional(?)
Модификатор типа в Swift, указывающий, что значение может быть nil, например var name: String?. Поля, генерируемые этим инструментом, по умолчанию не Optional, после генерации можно вручную добавить ? в зависимости от того, может ли поле JSON отсутствовать.
Array([T])
Сокращение типа массива в Swift. Этот инструмент преобразует массивы JSON в [T], T выводится по типу элементов массива, например [String], [Int] или [пользовательский тип].
Codable
Комбинация протоколов Decodable и Encodable в Swift. После реализации Codable можно использовать JSONDecoder для парсинга данных JSON в экземпляры типов. Этот инструмент по умолчанию не генерирует Codable, нужно добавить вручную.
JSONDecoder
Парсер JSON в фреймворке Foundation. Используется в сочетании с протоколом Codable, может преобразовывать Data в экземпляры типов Swift. После вывода чистых типов этим инструментом разработчики могут самостоятельно парсить с помощью JSONDecoder.
URLSession
API сетевых запросов в фреймворке Foundation платформы Apple. Распространенное использование - URLSession.shared.data(from: url), в сочетании с JSONDecoder для завершения интеграции интерфейсов.
Alamofire
Самая популярная сторонняя HTTP-библиотека в сообществе Swift. Обернута на основе URLSession, поддерживает responseDecodable для прямой десериализации в типы Swift.
Moya
Сетевой абстрактный слой Swift, обычно используется в паре с Alamofire. Moya в сочетании с типами Codable может значительно упростить шаблонный код вызовов API.
Vapor
Ведущий серверный фреймворк Swift, использующий Swift для создания веб-приложений на macOS / Linux. Структуры Swift, сгенерированные этим инструментом, также могут использоваться для моделей маршрутизации Vapor.
quicktype
Инструмент с открытым исходным кодом для генерации типов с поддержкой многих языков, этот инструмент завершает преобразование JSON в Swift через quicktype-core в Web Worker браузера.
Property
Объявление свойства в типе Swift. Этот инструмент отображает каждый ключ JSON в свойство Swift, например "name": "Alice" отображается в var name: String.
Type Inference
Процесс автоматического вывода типа Swift на основе литеральной формы значений JSON. Этот инструмент выполняет сопоставление на основе null, boolean, number, string, array, object.
localStorage
Локальное хранилище ключ-значение браузера. Этот инструмент использует localStorage для сохранения последней истории ввода, восстановления после обновления или случайного закрытия страницы.
Web Worker
Механизм фоновых потоков, предоставляемый браузером. Этот инструмент загружает и выполняет quicktype-core через Web Worker, избегая блокировки основного потока при преобразовании больших JSON.
SwiftUI
Декларативный UI-фреймворк, представленный Apple. Типы Swift, сгенерированные этим инструментом, могут использоваться как модели данных для представлений SwiftUI в сочетании с @State / @ObservedObject для управления интерфейсом.
Combine
Реактивный фреймворк программирования Apple. Сгенерированные типы Swift в сочетании с JSONDecoder могут строить реактивные потоки данных dataTaskPublisher.
SwiftData
Фреймворк сохранения данных, представленный Apple в 2023 году. Типы, сгенерированные этим инструментом, могут служить базовыми классами моделей SwiftData, после добавления @Model могут управляться SwiftData.
Value Type / Reference Type
В Swift struct - это тип значения, class - ссылочный тип. Этот инструмент по умолчанию генерирует struct, при присваивании копируется; если нужна ссылочная семантика, можно вручную изменить на class.
Field Naming
Этот инструмент по умолчанию сохраняет исходные имена полей JSON. Если исходный JSON в snake_case, а проект требует camelCase, нужно переименовать вручную или настроить рендерер quicktype.
ISO 8601 дата
Распространенный формат даты JSON, например 2026-07-14T10:00:00Z. Требуется комплект JSONDecoder.dateDecodingStrategy = .iso8601 для правильного парсинга в тип Date.

Шпаргалка сопоставления типов JSON типам Swift

Инструмент автоматически выводит соответствующие типы Swift на основе формы значений JSON:

Пример значения JSONМетод определенияСгенерированный тип SwiftПримечание
nullvalue === nullAny? или конкретный OptionalНевозможно вывести конкретный тип, после генерации рекомендуется вручную изменить на Optional<T>
true / falsetypeof value === 'boolean'BoolНепосредственное сопоставление с булевым типом Swift
42typeof value === 'number' && Number.isInteger(value)IntЦелые числа сопоставляются с Int (32/64 бита определяются платформой)
3.14typeof value === 'number' && !Number.isInteger(value)DoubleЧисла с плавающей точкой сопоставляются с Double
"hello"typeof value === 'string'StringСтроки сопоставляются с String
[] (пустой массив)Array.isArray(value) && value.length === 0[Any]Невозможно вывести тип элементов, рекомендуется дополнить пример или вручную изменить на конкретный тип
["a", "b"]Array.isArray(value) && typeof value[0] === 'string'[String]Массив строк
[1, 2, 3]Array.isArray(value) && typeof value[0] === 'number'[Int]Массив целых чисел
[1.5, 2.5]Array.isArray(value) && typeof value[0] === 'number' && !Number.isInteger(value[0])[Double]Массив чисел с плавающей точкой
[{...}, {...}]Array.isArray(value) && typeof value[0] === 'object'[Item]Массив объектов, элементы - пользовательские типы, имена выводятся по именам полей
{...} (вложенный объект)typeof value === 'object' && !Array.isArray(value)Независимый struct / classРекурсивная генерация независимых типов, имена с заглавной буквы по имени поля

Распространенные сценарии использования JSON в Swift в экосистеме Apple

Сгенерированные типы Swift можно напрямую использовать в различных сценариях платформы Apple / сторонних фреймворков:

Сценарий использованияРаспространенные фреймворкиТребуемые протоколы / обработкаТипичный фрагмент кода
Парсинг REST APIURLSession + JSONDecoderДобавить Codable к типам, сохранить семантику значений structtry JSONDecoder().decode(User.self, from: data)
Упрощение HTTP-запросовAlamofireДобавить Codable к типам, в сочетании с responseDecodablesession.request(url).responseDecodable(of: User.self)
Абстракция сетевого слояMoyaДобавить Codable к типам, Moya автоматически десериализуетprovider.request(.user(id: 1)).map(User.self)
Реактивный поток данныхCombine + JSONDecoderДобавить Codable к типам, в сочетании с dataTaskPublisherURLSession.shared.dataTaskPublisher(for: url).decode(type: User.self, decoder: decoder)
Отображение списков SwiftUISwiftUI List + IdentifiableДобавить Identifiable к типам, чтобы List автоматически forEachList(items) { Text($0.name) }
Определение серверных моделейVaporДобавить Codable к типам, Vapor автоматически сериализует Contentstruct User: Codable, Content { var id: Int; var name: String }
Модели локального сохраненияSwiftData / Core DataНа сгенерированном struct / class добавить @Model / @NSManaged@Model class User { var id: Int; var name: String }
Кроссплатформенное совместное использование типовJSON в Swift + JSON в TypeScript совместноСохранять имена полей Swift и TS согласованными, на стороне TS в сочетании с типами TSSwift: var name: String / TS: name: string

Privacy & Security

Все операции анализа JSON и генерации типов Swift этого инструмента JSON в Swift полностью выполняются локально в вашем браузере через JavaScript (quicktype-core / Web Worker), введенные данные JSON и сгенерированный код Swift не загружаются на какие-либо серверы, не записываются, не кэшируются и не хранятся в облаке. Конфиденциальные JSON, содержащие поля внутренних интерфейсов, API key, токены, личные данные пользователей, неопубликованные бизнес-структуры, можно использовать с уверенностью, после закрытия или обновления страницы все входные и выходные данные автоматически удаляются из памяти, не зависит от каких-либо сторонних сетевых сервисов.

Authoritative References