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 등 서버 프레임워크의 핵심 언어이기도 합니다. 개발에서는 API가 반환하는 JSON을 해당 Swift 타입으로 작성해야 할 일이 빈번한데, 수작업은 시간이 오래 걸릴 뿐만 아니라 옵셔널 필드를 누락하기 쉬우므로 이 도구는 이 프로세스를 자동화합니다.

이 도구는 quicktype-core를 사용하여 브라우저 로컬에서 변환을 완료합니다. quicktype은 다국어를 지원하는 구조 생성기로, 이 도구는 Swift용으로 just-types와 no-comments 옵션을 활성화했기 때문에 깨끗한 struct/class 프로퍼티 선언이 출력되며 Codable, Decodable, Encodable 등 직렬화 어노테이션이 포함되지 않고 import 문이나 파일 헤더 주석도 포함되지 않습니다. 이러한 '베어 타입'을 통해 개발자는 프로젝트 필요에 따라 자유롭게 프로토콜을 추가하거나 접근 제어를 조정하거나 Alamofire/Moya 등 네트워크 프레임워크가 선호하는 명명 규칙으로 변경할 수 있습니다.

Swift의 타입 시스템은 안전성으로 유명합니다. struct는 값 타입으로 불변 데이터 표현에 적합하며 class는 참조 타입으로 상태 공유나 상속이 필요한 시나리오에 적합합니다. 이 도구가 생성하는 프로퍼티는 가능한 한 Swift의 String, Int, Double, Bool, [T], 사용자 정의 타입 등에 매핑됩니다. 개발자는 생성 후 비즈니스 요구에 따라 일부 필드를 Optional(?)로 변경하거나 타입에 Codable 프로토콜을 추가하거나 struct 전체를 class로 업그레이드하여 참조 의미론을 얻을 수 있습니다.

중첩 객체 처리는 도구의 핵심 기능입니다. JSON에 중첩 객체가 포함되면 도구는 재귀적으로 독립적인 서브타입을 생성합니다. 예를 들어 Root에 address 객체가 포함되면 Address 타입이 생성되고 메인 타입에서 var address: Address로 참조됩니다. 이를 통해 타입 중복 정의를 방지하고 Xcode의 자동 완성과 타입 검사가 계층 관계를 올바르게 추적할 수 있게 합니다. 명명 규칙은 필드명 첫 글자를 대문자로 하며 예를 들어 users 배열의 요소는 User로 명명됩니다.

배열 타입 추론은 '첫 번째 요소로 추론' 전략을 따릅니다. 배열 요소가 문자열이면 [String], 정수이면 [Int], 부동소수점이면 [Double], 객체이면 [사용자 정의 타입]을 생성합니다. 빈 배열 []은 샘플이 부족하므로 [Any] 또는 폴백 타입을 생성하며 실제 비즈니스에 따라 구체적인 타입으로 변경하는 것을 권장합니다. 특히 큰 배열이나 희소 배열의 경우 소스 JSON에 실제 샘플 요소를 배치하여 추론 정확도를 높이는 것을 권장합니다.

순수 프론트엔드 처리는 이 도구의 핵심 아키텍처 이점입니다. 모든 JSON 파싱과 Swift 코드 생성은 브라우저 JavaScript(Web Worker의 quicktype-core 포함)에서 실행되며 백엔드 서비스에 의존하지 않고 어떤 서버에도 데이터를 전송하지 않습니다. 이러한 설계는 민감한 정보를 포함할 수 있는 JSON 데이터를 보호할 뿐만 아니라 변환 속도가 로컬 디바이스 성능에만 제한되어 네트워크 왕복을 기다릴 필요가 없습니다. API 키나 공개되지 않은 비즈니스 필드를 포함하는 JSON 처리에 특히 중요합니다.

이 도구는 Codable/CodingKeys/Date 디코딩 전략을 강제로 바인딩하는 일부 온라인 도구와 다릅니다: 팀원들은 프로토콜, 명명, 접근 제어에 대해 다른 선호도를 가지는 경우가 많으며 이 도구는 최소 출력 원칙을 고수하여 프로토콜과 전략 선택은 개발자가 프로젝트 필요에 따라 재가공할 수 있도록 남겨둡니다. 이러한 '반제품 생성 + 프로젝트 레벨 2차 가공' 워크플로는 중대형 팀에서 일반적으로 '원클릭 올인원'보다 엔지니어에게 선호됩니다.

사용 사례

  • iOS 개발: 백엔드 REST API가 반환하는 JSON을 Swift struct로 변환하여 SwiftUI 또는 UIKit 네트워크 계층 모델링과 JSONDecoder 디코딩에 사용
  • macOS 개발: 앱 구성 JSON을 Swift 타입으로 변환하여 AppKit 프로젝트에서 타입 안전한 구성 읽기를 수행하고 오타를 방지
  • watchOS 개발: Apple Watch 앱의 건강·운동 데이터 JSON을 Swift 모델로 변환하여 SwiftUI 및 HealthKit과 연동
  • tvOS 개발: 콘텐츠 추천 인터페이스 JSON을 Swift 타입으로 변환하여 TV 앱 홈 데이터 표시와 포커스 내비게이션에 사용
  • SwiftUI MVVM 모델링: API 데이터 모델을 @Published 프로퍼티로 직접 ViewModel에 바인딩하여 화면 뷰를 구동
  • Combine 리액티브 데이터 플로: JSON 응답 타입을 Publisher의 출력 타입으로 사용하고 JSONDecoder와 결합하여 리액티브 파싱 수행
  • SwiftData/Core Data 사전 모델링: 먼저 Swift struct를 생성한 후 수동으로 @Model 또는 @NSManaged 어노테이션을 추가하여 엔티티 매핑
  • 서드파티 SDK 연동: SDK 문서의 JSON 응답 예제를 Swift 타입으로 변환하여 로그인, 결제, 푸시, 지도 등 SDK에 빠르게 연동
  • 단위 테스트 준비: 인터페이스 mock JSON을 Swift 타입으로 변환하여 XCTest 테스트 데이터와 어설션에 사용하여 테스트 유지보수성 향상
  • 코드 리뷰: API가 반환하는 JSON을 Swift 타입으로 변환하여 팀 Code Review 시 필드 명명과 옵셔널성에 대해 논의하기 쉽게 함
  • Flutter/React Native 하이브리드 개발: 네이티브 Swift 모듈 호출을 위한 데이터 모델을 준비하여 bridge 계층의 타입 변환 오류 감소
  • 백엔드 인터페이스 마이그레이션: REST 인터페이스 문서 또는 Postman 예제 JSON에서 Swift 클라이언트 모델을 생성하여 버전 업그레이드 시 빠르게 동기화
  • 교육 훈련: Swift/iOS 과정에서 JSON에서 타입 시스템으로의 매핑을 시연하여 학생들이 API 데이터 모델링과 타입 안전을 이해하도록 지원
  • 건강·피트니스 앱: HealthKit/Fitbit 등 인터페이스가 반환하는 JSON을 Swift 타입으로 변환하여 Apple Health 데이터 모델링에 사용
  • 결제·금융 앱: 결제 게이트웨이의 인터페이스 응답 JSON을 Swift 모델로 변환하여 대조와 예외 처리 용이
  • 전자상거래 주문 시스템: 주문, 상품, 주소 등 JSON을 Swift struct로 변환하여 SwiftUI 리스트와 상세 페이지 표시에 사용
  • 뉴스·콘텐츠 앱: 콘텐츠 관리 시스템의 JSON 응답을 Swift 타입으로 변환하여 TableView/SwiftUI 리스트/상세 페이지에 사용
  • Vapor 서버 개발: 백엔드 API의 요청/응답 JSON을 Swift 구조체로 변환하여 서버 모델 정의와 Codable 인코딩/디코딩에 사용
  • MapKit과 지리 데이터: 지도 인터페이스가 반환하는 JSON을 Swift struct로 변환하여 장소 검색, 경로 계획, 지오코딩 결과 모델링에 사용

이용 방법

  1. 왼쪽 편집기에 JSON 내용을 붙여넣거나 업로드 버튼을 클릭하여 .json/.txt 파일을 선택하거나 내장 예제 데이터를 로드
  2. 도구가 400ms 디바운스 후 quicktype-core를 자동으로 호출하여 변환하고 오른쪽에 생성된 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 디바운스 자동 변환: JSON을 붙여넣거나 수정하면 거의 실시간으로 Swift 타입을 생성합니다. 변환 버튼을 반복해서 클릭할 필요가 없으며 변환 프로세스는 완전히 비동기로 UI를 차단하지 않습니다
  • Web Worker 백그라운드 실행: quicktype-core가 브라우저 Web Worker에서 실행되어 큰 JSON 변환 시 메인 스레드 프리징과 편집 끊김을 방지합니다
  • 지능형 타입 추론: String, Int, Double, Bool, [T], 사용자 정의 타입을 자동 매핑합니다. 배열은 첫 번째 요소 타입으로 추론하며 필드 타입을 수동으로 작성할 필요가 없습니다
  • 중첩 객체 자동 전개: 재귀적으로 각 중첩 객체에 대해 독립적인 Swift 타입을 생성하고 필드명 첫 글자를 대문자로 지정하여 타입 중복 정의를 방지합니다
  • 배열 타입 자동 추론: JSON 배열은 자동으로 [String]/[Int]/[Double]/[사용자 정의 타입]으로 변환됩니다. 빈 배열은 기본적으로 [Any]를 생성합니다
  • 한 번의 클릭으로 JSON 오류 복구: 뒤에 오는 쉼표, 작은따옴표, 누락된 따옴표, 주석 등 일반적인 형식 오류가 있을 때 한 번의 클릭으로 자동 복구하고 변환을 계속할 수 있습니다
  • 한 번의 클릭으로 복사 + .swift 다운로드: 생성된 Swift 코드를 한 번의 클릭으로 클립보드에 복사하거나 .swift 파일로 다운로드하여 Xcode 프로젝트에 직접 드래그할 수 있습니다
  • 예제 데이터 + 파일 업로드: Swift 스타일의 예제 JSON(중첩된 address/company/tags 포함)을 내장하고 있으며 .json/.txt 파일의 드래그 앤 드롭 또는 클릭 업로드를 지원합니다
  • localStorage 입력 기록: 최근 입력을 자동 저장합니다. 페이지를 새로고침하거나 실수로 닫아도 빠르게 복원하여 계속 편집할 수 있어 콘텐츠 유실 걱정이 없습니다
  • 반응형 분할 화면 편집기: 좌우 분할 화면으로 실시간 미리보기. 데스크톱과 모바일에 자동 적응하며 작은 화면에서도 원활하게 조작할 수 있습니다

코드 예제

Swift: URLSession + JSONDecoder로 생성 struct 파싱

swift

iOS/macOS 프로젝트의 가장 일반적인 사용법: 본 도구가 생성한 struct에 Codable을 추가한 후 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 내용을 왼쪽 입력 상자에 붙여넣으면 도구가 400ms 디바운스 후 quicktype-core를 호출하여 자동으로 Swift 코드로 변환하고 오른쪽 패널에 실시간으로 결과를 표시합니다. 업로드 버튼을 클릭하여 .json/.txt 파일을 선택하거나 예제 버튼을 클릭하여 내장 데이터를 로드할 수도 있습니다. 변환 완료 후 한 번의 클릭으로 복사하거나 .swift 파일로 다운로드할 수 있습니다.

생성된 Swift 코드에 Codable이 포함되나요?

기본적으로 포함되지 않습니다. 이 도구는 quicktype-core의 just-types 모드를 사용하여 순수 struct/class 프로퍼티 선언을 출력합니다. Codable, Decodable, Encodable 어노테이션이 없으며 import 문도 포함되지 않습니다. Codable이 필요한 경우 생성 후 수동으로 : Codable을 추가하기만 하면 됩니다(예: struct User: Codable {}). 또는 직접 JSONDecoder 파싱 로직을 작성할 수도 있습니다.

어떤 JSON 데이터 구조를 지원하나요?

모든 유효한 JSON을 지원합니다: 기본 타입(null, boolean, number, string), 1차원 또는 다차원 배열, 임의의 깊이의 중첩 객체. 루트 입력은 JSON 객체 또는 JSON 배열일 수 있으며 도구는 객체 우선, 배열은 첫 번째 요소로 추론하는 방식으로 처리합니다. 지원하지 않는 입력에는 JavaScript 특수 값(함수, Symbol, undefined) 및 비-JSON 텍스트가 포함됩니다.

중첩된 JSON 객체는 어떻게 처리되나요?

도구는 재귀적으로 각 중첩 객체에 대해 독립적인 Swift 타입을 생성합니다. 명명 규칙은 부모 타입명과 필드명 조합에 기반합니다. 예를 들어 Root에 address 필드가 포함되면 Address 서브타입이 생성되고 메인 타입에서 var address: Address로 참조됩니다. 이를 통해 타입 중복 정의를 방지하고 Xcode의 자동 완성과 타입 검사가 계층 관계를 올바르게 추적할 수 있게 합니다.

배열 필드는 Swift 배열로 변환되나요?

예. JSON 배열은 자동으로 Swift [T] 형식으로 변환됩니다. 배열 요소가 문자열이면 [String], 정수이면 [Int], 부동소수점이면 [Double], 객체이면 [사용자 정의 타입]을 생성합니다. 빈 배열 []은 샘플 요소가 없으므로 기본적으로 [Any]를 생성합니다. 생성 후 수동으로 [String]이나 [Int] 등 구체적인 타입으로 변경하는 것을 권장합니다.

null 값 필드에는 어떤 타입이 생성되나요?

JSON의 null 값은 구체적인 타입을 추론할 수 없으므로 도구는 Any 또는 폴백 타입을 생성할 수 있습니다. 소스 JSON에서 null인 필드를 예제 값(예: "field": ""는 String으로 추론)으로 교체하거나 비즈니스에 따라 수동으로 Optional(예: var phone: String?)로 변경하는 것을 권장합니다. 이는 Swift 타입 시스템의 안전한 의미론에 더 부합합니다.

생성된 구조체 이름을 사용자 정의할 수 있나요?

예. 도구 모음에서 타입 이름 버튼(또는 설정 진입점)을 클릭하면 루트 타입 이름(기본값은 Root 또는 예제 데이터에서 추론)을 수정할 수 있습니다. 서브타입 명명은 루트 이름과 필드명에 기반하여 자동 생성되며 명명 규칙은 필드명 첫 글자를 대문자로 합니다. 예: users → User, tags → Tag.

JSON 형식 오류가 발생하면 어떻게 하나요?

도구는 JSON 유효성을 자동으로 감지하며 오류 시 오른쪽에 구체적인 오류 메시지를 표시하고 'JSON 복구' 버튼을 제공합니다. 클릭하면 일반적인 오류를 자동 복구합니다: 끝에 붙은 여분의 쉼표, 작은따옴표를 큰따옴표로 교체, 따옴표가 누락된 key 보완, 주석 제거 등. 복구가 성공하면 JSON을 수동으로 수정하지 않고도 변환을 계속할 수 있습니다.

데이터가 서버에 업로드되나요? 개인정보는 안전한가요?

완전히 로컬 브라우저에서 실행됩니다. 모든 JSON 파싱, Swift 코드 생성은 브라우저 JavaScript(Web Worker의 quicktype-core 포함)로 로컬에서 완료되며 입력된 JSON 데이터와 생성된 Swift 코드는 어떤 서버에도 업로드되지 않으며 클라우드에 기록되거나 캐시되지 않습니다. API key, token, 사용자 개인정보 필드, 공개되지 않은 비즈니스 구조 등 민감한 JSON도 안심하고 사용할 수 있으며 페이지를 닫으면 삭제됩니다.

생성된 코드를 Xcode 프로젝트에서 직접 사용할 수 있나요?

예. 생성된 코드는 표준 Swift 구문으로 Xcode의 .swift 파일에 직접 복사하거나 '다운로드' 버튼으로 .swift 파일로 저장하여 프로젝트에 드래그할 수 있습니다. 순수 타입 선언이 출력되므로 프로젝트 필요에 따라 수동으로 Codable, Equatable, Identifiable 등 프로토콜을 추가하거나 접근 제어 수정자(public/internal/private)를 조정하는 것을 권장합니다.

루트 입력으로 JSON 배열을 지원하나요?

지원합니다. 루트 입력이 JSON 배열인 경우 도구는 배열의 첫 번째 요소를 템플릿으로 요소 타입을 생성하고 해당 요소 타입 정의를 출력합니다. 예를 들어 [{"id":1,"name":"A"}]는 Item이라는 struct(또는 필드에서 추론된 이름)를 생성하며 그 필드는 첫 번째 요소의 필드가 됩니다. 메인 타입은 property items: [Item]로 참조하여 배열을 직접 루트 타입으로 다루는 것을 피합니다.

큰 JSON을 변환하면 끊기나요?

도구에는 명시적인 크기 제한이 없지만 브라우저가 초대형 JSON을 파싱하고 렌더링하면 느려집니다. 권장 사항: ① 한 번에 하나의 비즈니스 모듈 JSON만 변환, ② 중첩 계층이 너무 깊으면 계층을 나누어 처리, ③ 수 MB를 초과하는 JSON은 명령줄 버전 quicktype 사용, ④ 동일한 JSON을 여러 하위 모듈로 나누어 각각 변환하면 메모리 사용량을 크게 줄일 수 있습니다.

JSON에서 TypeScript로의 변환과 서로 대체하여 사용할 수 있나요?

둘 다 JSON을 해당 언어의 타입 정의로 변환하지만 중점이 다릅니다: JSON → Swift는 struct/class 프로퍼티 선언을 생성하여 iOS/macOS 네이티브 앱에 사용; JSON → TypeScript는 interface/type 선언을 생성하여 프론트엔드 타입 검사에 사용합니다. 프로젝트에 iOS 클라이언트와 Web 프론트엔드가 모두 있는 경우 동일한 JSON에 대해 Swift와 TS 두 버전을 각각 생성하여 양쪽 타입 일관성을 보장하는 것을 권장합니다.

생성된 코드에 Codable 프로토콜을 어떻게 추가하나요?

이 도구는 기본적으로 순수 타입을 출력하며 프로토콜이 직접 포함되지 않습니다. 생성 후 struct/class 선언 뒤에 : Codable을 추가하기만 하면 됩니다. 예: struct User: Codable {}. 이제 JSONDecoder를 사용할 수 있습니다. 기본적으로 Codable을 포함하려면 quicktype-core를 포크하여 Swift 렌더러를 수정하거나 생성 후 Xcode의 일괄 치환 기능으로 모든 타입에 프로토콜을 추가할 수 있습니다.

네트워크 연결이 필요한가요? 모바일에서도 사용할 수 있나요?

페이지에 처음 접속할 때는 도구 스크립트와 quicktype-core 리소스를 가져오기 위해 네트워크 연결이 필요합니다. 그 후에는 브라우저 캐시에서 오프라인으로 실행할 수 있습니다(접속한 적이 있는 브라우저에서). 모바일 브라우저(iOS Safari, Android Chrome)에서도 정상적으로 사용할 수 있으며 인터페이스는 반응형 분할 화면 디자인으로 세로 모드에서는 자동으로 상하 스태킹으로 전환됩니다.

생성 후 다른 타입을 손상시키지 않고 특정 타입을 개별적으로 수정할 수 있나요?

지원합니다. 생성 후 각 Swift 타입은 독립적인 struct/class이며 도구의 출력은 순수 텍스트입니다. 특정 타입만 개별적으로 복사하여 Xcode에 붙여넣거나 Xcode에서 Rename 리팩토링을 사용하여 타입과 필드를 일괄 변경해도 다른 타입에 영향을 주지 않습니다. 타입 세트 전체를 다시 생성해야 하는 경우 페이지를 새로고침한 후 다시 JSON을 붙여넣으면 됩니다.

Swift enum 추론을 지원하나요?

quicktype의 union/열거형 지원에는 추가적인 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 또는 폴백 타입을 생성할 수 있습니다. 소스 JSON의 null을 대표적 샘플 값("" 또는 0 등)으로 교체하고 생성 후 해당 필드를 Optional(?) 또는 구체적 타입으로 변경하는 것을 권장합니다. 예: var phone: String?.

생성된 타입명이 프로젝트 규약에 맞지 않음

도구 모음에서 루트 타입명을 변경할 수 있습니다. 서브타입명은 루트명+필드명에 기반하여 자동 생성됩니다. 그래도 만족스럽지 않으면 생성 후 Xcode에서 Rename 리팩토링을 사용하여 일괄 변경하세요(우클릭 → Refactor → Rename). Xcode는 모든 참조를 동기화하여 업데이트합니다.

큰 JSON 변환 후 페이지가 끊김

브라우저가 초대형 JSON을 렌더링하고 많은 타입을 생성하면 느려집니다. JSON을 여러 독립 비즈니스 모듈로 나누어 각각 변환하거나 모델링이 필요한 주요 객체만 추출하여 변환하는 것을 권장합니다; 10MB를 초과하는 JSON은 명령줄 버전 quicktype 사용을 권장합니다.

Xcode 컴파일 오류 'Type 'X' does not conform to protocol 'Decodable''

일부 필드에 Codable을 추가한 후 Optional/Date/Enum 등 타입을 올바르게 처리하지 않았음을 나타냅니다. 일반적 수정: ① null이 될 수 있는 모든 필드를 Optional<T>로 변경; ② 커스텀 날짜 전략 JSONDecoder().dateDecodingStrategy = .iso8601; ③ 커스텀 CodingKeys로 JSON key와 Swift 프로퍼티명 일치.

필드명이 snake_case, Swift 관례는 camelCase

본 도구는 기본적으로 JSON 원본 필드명을 유지하므로 snake_case 필드는 그대로 생성됩니다. camelCase로 통일하려면 생성 후 Xcode Rename으로 일괄 이름 변경하거나 커스텀 quicktype 렌더러에서 필드명을 camelCase로 변환한 후 CodingKeys 매핑을 보완하여 JSON 디코딩이 올바른지 확인하세요.

다운로드한 .swift 파일을 Xcode에서 열면 중국어 key로 오류가 발생함

Swift는 필드명을 영어 ASCII 식별자로 할 것을 권장합니다. 소스 JSON에 중국어 key(예: {"姓名": "Alice"})가 포함되면 생성된 var 姓名: String은 일부 구버전에서 Swift 컴파일러가 오류를 보고할 수 있습니다. 소스 JSON의 key를 영어(name 등)로 변경하는 것을 권장합니다. 이는 Swift 코딩 규약에 더 부합합니다.

타입이 var뿐이고 let/private 제어가 없음

본 도구는 기본적으로 var public 프로퍼티를 생성하여 생성 후 재가공을 쉽게 합니다. let 또는 접근 제어(private(set) 등)가 필요한 경우 Xcode에서 Refactor → Add Access Control을 사용하여 일괄 변경하거나 생성 후 sed/텍스트 편집 도구로 var를 let으로 치환할 수 있습니다.

JSON에 ISO 8601 날짜 문자열이 포함되어 있는데 Date 필드 디코딩에 실패함

본 도구는 기본적으로 ISO 8601 문자열을 String으로 매핑하며 Swift는 자동으로 Date로 변환하지 않습니다. JSONDecoder에서 dateDecodingStrategy를 설정해야 합니다. 예: JSONDecoder().dateDecodingStrategy = .iso8601. 날짜 형식이 비표준인 경우 DateFormatter 또는 커스텀 파싱 로직을 수동으로 구현해야 합니다.

중첩 계층이 너무 깊어 이름이 충돌함

도구는 '필드명 첫 글자 대문자'를 서브타입 명명 규칙으로 합니다. 깊게 중첩된 JSON에서는 동명 중첩 객체가 존재하여 타입 충돌이 발생할 수 있습니다. 해결 방법: ① 소스 JSON 필드에 비즈니스 접두사 추가; ② 루트 JSON을 여러 독립 모듈로 나누어 각각 생성; ③ 생성 후 Xcode Rename으로 충돌하는 타입명 일괄 변경.

public struct가 생성되는데 프로젝트가 module로 분리되어 있음

본 도구는 기본적으로 internal struct를 생성하며 명시적 public 수식자가 없습니다. 프로젝트가 module별로 분리되어 있고 크로스모듈 접근이 필요한 경우 Xcode에서 struct를 public struct로 일괄 치환하거나 생성 후 sed/awk 스크립트로 public 키워드를 일괄 추가해야 합니다.

용어집

struct
Swift의 값 타입. 기본적으로 불변 데이터 모델 표현에 적합하며 대입 시 복사됩니다. 본 도구는 기본적으로 JSON 객체를 표현하기 위해 struct를 생성합니다.
class
Swift의 참조 타입. 상태 공유, 상속 또는 식별(===)이 필요한 시나리오에 적합합니다. 본 도구는 일부 설정에서 class를 생성할 수 있습니다.
Optional(?)
Swift에서 값이 nil일 수 있음을 나타내는 타입 수정자. 예: var name: String?. 본 도구가 생성하는 필드는 기본적으로 비Optional이며 JSON 필드가 누락될 수 있는지 여부에 따라 생성 후 수동으로 ?를 추가할 수 있습니다.
Array([T])
Swift의 배열 타입 약어. 본 도구는 JSON 배열을 [T]로 변환하며 T는 배열 요소 타입에서 추론됩니다. 예: [String], [Int] 또는 [사용자 정의 타입].
Codable
Swift에서 Decodable과 Encodable의 프로토콜 합성. Codable을 구현하면 JSONDecoder를 사용하여 JSON 데이터를 타입 인스턴스로 파싱할 수 있습니다. 본 도구는 기본적으로 Codable을 생성하지 않으며 수동으로 추가해야 합니다.
JSONDecoder
Foundation 프레임워크의 JSON 파서. Codable 프로토콜과 함께 사용하여 Data를 Swift 타입 인스턴스로 변환할 수 있습니다. 본 도구가 순수 타입을 출력한 후 개발자는 직접 JSONDecoder를 사용하여 파싱할 수 있습니다.
URLSession
Apple 플랫폼 Foundation 프레임워크의 네트워크 요청 API. 일반적인 사용법은 URLSession.shared.data(from: url)이며 JSONDecoder와 결합하여 인터페이스 연동을 완료합니다.
Alamofire
Swift 커뮤니티에서 가장 인기 있는 서드파티 HTTP 네트워크 라이브러리. URLSession 기반으로 래핑되어 있으며 responseDecodable을 지원하여 Swift 타입으로 직접 역직렬화합니다.
Moya
Swift 네트워크 추상화 계층으로 보통 Alamofire와 함께 사용됩니다. Moya를 Codable 타입과 결합하면 API 호출 보일러플레이트 코드를 크게 줄일 수 있습니다.
Vapor
Swift의 주류 서버 프레임워크로 macOS/Linux에서 Swift로 웹 애플리케이션을 구축합니다. 본 도구가 생성하는 Swift 구조체는 Vapor의 라우팅 모델에도 사용할 수 있습니다.
quicktype
다국어를 지원하는 타입 생성기 오픈소스 도구. 본 도구는 quicktype-core를 통해 브라우저 Web Worker 내에서 JSON에서 Swift로의 변환을 완료합니다.
Property
Swift 타입의 프로퍼티 선언. 본 도구는 JSON의 각 key를 Swift 프로퍼티에 매핑합니다. 예: "name": "Alice"는 var name: String에 매핑됩니다.
Type Inference
JSON 값의 리터럴 형식에 기반하여 Swift 타입을 자동으로 추론하는 프로세스. 본 도구는 null, boolean, number, string, array, object에 기반하여 매핑을 수행합니다.
localStorage
브라우저의 로컬 키-값 스토어. 본 도구는 localStorage를 사용하여 최근 입력 기록을 저장하며 페이지를 새로고침하거나 실수로 닫은 후 복원할 수 있게 합니다.
Web Worker
브라우저가 제공하는 백그라운드 스레드 메커니즘. 본 도구는 Web Worker를 통해 quicktype-core를 로드 및 실행하여 큰 JSON 변환이 메인 스레드를 차단하는 것을 방지합니다.
SwiftUI
Apple이 발표한 선언적 UI 프레임워크. 본 도구가 생성하는 Swift 타입은 SwiftUI 뷰의 데이터 모델로 사용할 수 있으며 @State/@ObservedObject와 결합하여 UI를 구동합니다.
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. Date 타입으로 올바르게 파싱하려면 JSONDecoder.dateDecodingStrategy = .iso8601을 연동해야 합니다.

JSON 타입 → Swift 타입 매핑 치트시트

도구는 JSON 값의 형식에 기반하여 해당 Swift 타입을 자동으로 추론합니다:

JSON 값 예시판정 방법생성 Swift 타입설명
nullvalue === nullAny? 또는 구체적 Optional구체적 타입을 추론할 수 없으므로 생성 후 수동으로 Optional<T>로 변경 권장
true / falsetypeof value === 'boolean'BoolSwift 불리언 타입에 직접 매핑
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 API 파싱URLSession + JSONDecoder타입에 Codable 추가, struct 값 의미론 유지try JSONDecoder().decode(User.self, from: data)
HTTP 요청 간소화Alamofire타입에 Codable 추가, responseDecodable과 결합session.request(url).responseDecodable(of: User.self)
네트워크 계층 추상화Moya타입에 Codable 추가, Moya가 자동 역직렬화provider.request(.user(id: 1)).map(User.self)
리액티브 데이터 플로Combine + JSONDecoder타입에 Codable 추가, dataTaskPublisher와 결합URLSession.shared.dataTaskPublisher(for: url).decode(type: User.self, decoder: decoder)
SwiftUI 리스트 표시SwiftUI List + Identifiable타입에 Identifiable 추가, List가 자동 forEachList(items) { Text($0.name) }
서버사이드 모델 정의Vapor타입에 Codable 추가, Vapor가 자동 Content 직렬화struct 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 엔드에서 TS 타입과 결합Swift: var name: String / TS: name: string

Privacy & Security

본 JSON → Swift 도구의 모든 JSON 파싱, Swift 타입 생성 작업은 완전히 귀하의 브라우저 로컬에서 JavaScript(quicktype-core/Web Worker)로 실행되며 입력된 JSON 데이터와 생성된 Swift 코드는 어떤 서버에도 업로드되지 않고 클라우드에 기록, 캐시 또는 저장되지 않습니다. 내부 인터페이스 필드, API key, token, 사용자 개인 데이터, 공개되지 않은 비즈니스 구조를 포함하는 민감 JSON도 안심하고 사용할 수 있으며 페이지를 닫거나 새로고침하면 모든 입출력 내용이 메모리에서 자동으로 삭제되고 어떤 서드파티 네트워크 서비스에도 의존하지 않습니다.

Authoritative References