์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
- arkit
- BFS
- raywenderlich
- Lv2
- MVVM
- realm
- tableView
- ํจ์คํธ์บ ํผ์ค
- designpattern
- Xcode
- TCA
- RxSwift
- Flutter
- visionOS
- CollectionView
- ํ๋ก๊ทธ๋๋จธ์ค
- Swfit
- rxcocoa
- Kuring
- UIKit
- combine
- SnapKit
- swift
- SwiftUI
- node.js
- ๋ฐฑ์ค
- ios
- BOJ
- reactorkit
- XCTest
- Today
- Total
lgvv98
[Swift] JSON ํํ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ ๋ณธ๋ฌธ
[Swift] JSON ํํ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ
๐ฅ ์บ๋ฟ๋งจ 2024. 6. 18. 23:22JSON ํํ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ
์๋ฒ์์ 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
'apple > ๐ Apple Docs & iOS & Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Xcode 16 Beta] Could not download and install iOS 18.0 Simulator runtime with Xcode 16.0 beta (0) | 2024.06.12 |
---|---|
[iOS] infinite carousel DiffableDataSource + CompositionalLayout (0) | 2024.04.16 |
[Swift] New access modifier: package (0) | 2024.04.05 |
[Natural Language] ํ ์คํธ ๊ฐ ์ ์ฌ์ ์ฐพ๊ธฐ (0) | 2024.03.27 |
[Natural Language] Overview (0) | 2024.03.27 |