Notice
Recent Posts
Recent Comments
Link
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[Swift] JSON ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ• ๋ณธ๋ฌธ

apple/๐Ÿ“š Apple Docs & iOS & Swift

[Swift] JSON ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2024. 6. 18. 23:22

JSON ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

 

์„œ๋ฒ„์—์„œ JSON์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์˜ฌ๋ ค๋‹ฌ๋ผ๊ณ  ํ•ด์„œ, ๊ตฌ์กฐ์ฒด๋ฅผ ํŠน์ • ํ‚ค ๊ฐ’์„ ์ง€์ •ํ•ด์„œ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•™์Šตํ•œ ๋ถ€๋ถ„

 

 

์•„๋ž˜๋Š” JSON์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ

extension Encodable {
    /// ์ธ์ฝ”๋”ฉ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์„ JSON ์ง๋ ฌํ™”
    var jsonSerialized: String? {
        let jsonEncoder = JSONEncoder()
        do {
            jsonEncoder.outputFormatting = .withoutEscapingSlashes
            let jsonData = try jsonEncoder.encode(self)
            return String(data: jsonData, encoding: .utf8)
        } catch {
            return nil
        }
    }
}

extension Array where Element: Encodable {
    /// ๋ฐฐ์—ด์„ JSON ์ง๋ ฌํ™”
    func jsonSerialization() -> String {
        let serialized = self.compactMap { element -> String? in
            guard let data = try? JSONEncoder().encode(element),
                  let jsonString = String(data: data, encoding: .utf8) else {
                return nil
            }
            return jsonString
        }
        return "[" + serialized.joined(separator: ",") + "]"
    }
}

 

 

encoder.outputFormatting์€ JSONEncoder์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์˜ต์…˜์œผ๋กœ, JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•  ๋•Œ ์ถœ๋ ฅ ํ˜•์‹์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ.


JSONEncoder.OutputFormatting ์˜ต์…˜๋“ค

1. prettyPrinted
- ์„ค๋ช…: JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํฌ๋งทํŒ…ํ•˜์—ฌ ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์—ฌ์“ฐ๊ธฐ๋˜๊ณ  ์ค„ ๋ฐ”๊ฟˆ์ด ์ถ”๊ฐ€.

2. sortedKeys
   - ์„ค๋ช…: JSON ๊ฐ์ฒด์˜ ํ‚ค๋ฅผ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ.

3. withoutEscapingSlashes
   - ์„ค๋ช…: ์Šฌ๋ž˜์‹œ (/) ๋ฌธ์ž๋ฅผ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  JSON์œผ๋กœ ์ถœ๋ ฅ. ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šฌ๋ž˜์‹œ๋Š” ์ด์Šค์ผ€์ดํ”„๋˜์–ด ์ถœ๋ ฅ.

4. withoutEscapingNonAscii
   - ์„ค๋ช…: ASCII ์ด์™ธ์˜ ๋ฌธ์ž๋ฅผ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  JSON์œผ๋กœ ์ถœ๋ ฅ. ๊ธฐ๋ณธ์ ์œผ๋กœ ASCII ์ด์™ธ์˜ ๋ฌธ์ž๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋กœ ์ถœ๋ ฅ.

5. prettyPrinted, sortedKeys
   - ์„ค๋ช…: ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํฌ๋งทํŒ…๋œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ.

- ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋ž€?

 - ์„ค๋ช…: ๋ฌธ์ž์—ด ๋‚ด์˜ ์Šฌ๋ž˜์‹œ(/)๋ฅผ \/๋กœ ์ฒ˜๋ฆฌํ•จ.

// ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ ์˜ˆ์‹œ

let person = Person(name: "John/Doe")

{
    "name" : "John\/Doe"
}

 

 

๊ตฌ์กฐ์ฒด์—์„œ ์ธ์ฝ”๋”ฉ ํ‚ค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ํ‚ค ๊ฐ’์œผ๋กœ JSON์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ•: CodingKeys๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณ€ํ™˜

 

์•„๋ž˜๋Š” ์ƒ˜ํ”Œ ๊ตฌ์กฐ์ฒด

struct MobileDeveloper: Encodable {
    var name: String
    var language: [Language]
    
    enum Language: Encodable {
        case swift
        case objc
        case java
        case kotlin
        
        // ์‚ฌ์šฉ์ž ์ •์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•
        func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
            switch self {
            case .swift, .objc:
                try container.encode("ios", forKey: .platform)
            case .java, .kotlin:
                try container.encode("android", forKey: .platform)
            }
        }
        
        enum CodingKeys: String, CodingKey {
            case platform
        }
    }
    
    enum Location: String, Encodable {
        case seoul
        case suwon
    }
    
    // ์‚ฌ์šฉ์ž ์ •์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        try container.encode(language, forKey: .language)
    }
    
    enum CodingKeys: String, CodingKey {
        case name
        case language
    }
}

 

์œ„์˜ ๋ฐฐ์—ด์„ ์ธ์ฝ”๋”ฉํ•˜๋ฉด

let developer = MobileDeveloper(name: "John Doe", language: [.swift, .java])
// ๊ฒฐ๊ณผ
{"name":"John Doe","language":[{"platform":"ios"},{"platform":"android"}]}

 

JSON ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” https://jsonlint.com/ ํ•ด๋‹น ์‚ฌ์ดํŠธ์—์„œ ๊ฐ€๋Šฅ

 

 

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด String์ด ์•„๋‹Œ ๊ฒƒ๋“ค๋„ ๋ชจ๋‘ ์ธ์ฝ”๋”ฉ ๊ฐ€๋Šฅ

let developer = MobileDeveloper(name: "John Doe", language: [.swift, .java])
let strings: [String] = ["1๋ฒˆ", "2๋ฒˆ"]
let string: String = "๋ฌธ์ž์—ด"
let integers: [Int] = [1, 2]
let integer: Int = 1
Comments