일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 디자인패턴
- initializer
- Swift
- IOS
- Protocol
- url
- type
- 이니셜라이저
- property
- enum
- Class
- initalizer
- 코딩테스트
- Git
- String
- init
- delegate
- instance
- struct
- extension
- optional
- Foundation
- Terminal
- 스위프트
- Xcode
- Unicode
- UIKit
- Method
- tuist
- interpace
Archives
- Today
- Total
아리의 iOS 탐구생활
[Swift/iOS] Codable로 JSON을 파싱해보자. 본문
반응형
🔍 Codable이 뭘까?
Codable은 Decodable와 Encodable를 준수하는 타입(프로토콜)이다.
JSON 데이터를 간편하고 쉽게 인코딩 & 디코딩 할 수 있게 해준다.
typealias Codable = Decodable & Encodable
구조체, 클래스, 열거형 모두 Codable을 채택할 수 있다.
먼저 JSON을 인코딩 및 디코딩을 하는데 이용할 타입을 만들어주고 Codable를 채택하자.
struct Person: Codable { // Codable 프로토콜 채택
var name: String
var age: Int
}
👉🏻 JSON 만들기 (Encoding)
- JSONEncoder를 선언한다.
- JSONEncoder의 encode메소드를 사용하여 인스턴스를 Data타입으로 만든다.
open func encode<T>(_ value: T) throws -> Data where T : Encodable - Data타입을 String타입으로 만든다.
let encoder = JSONEncoder() // encoder 선언
encoder.outputFormatting = [.sortedKeys, .prettyPrinted] // 출력스타일 설정
let ari = Person(name: "Ari", age: 27) // encode하고 싶은 인스턴스 생성
let jsonData = try? encoder.encode(ari) // encode안에 올수 있는 값은 Encodable를 준수하고 있는 타입만 가능하다.
// encode중에 에러를 발생할 수 있기 때문에 try를 반드시 함께 써줘야 한다.
//jsoData는 옵셔널이다. 따라서 옵셔널바인딩을 통해서 값을 출력해주었다. jsonString도 마찬가지로 옵셔널타입이다.
if let jsonData = jsonData, let jsonString = String(data: jsonData, encoding: .utf8) {
print(jsonString)
}
/* 출력예시
{
"age" : 27,
"SeverName" : "Ari"
}
*/
실제로 가장 많이 사용하는 것은 이 Decoding이다.
👉🏻 JSON 파싱 (Decoding)
- JSONDecoder를 선언한다.
- JSON. 즉 String타입을 Data타입으로 만든다
open func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable - Data타입을 JSONDecoder의 decode메소드를 사용하여 인스턴스로 만든다.
// 이것을 서버가 준 JSON 데이터라고 생각하자.
let jsonString = """
{
"age" : 27,
"name" : "Ari"
}
"""
let decoder = JSONDecoder() // decoder 선언
var data = jsonString.data(using: .utf8) // String 타입을 data로 바꿔준다.
// 옵셔널바인딩을 통하여 data를 인스턴스로 디코딩하는 작업.
// 마찬가지로 디코딩중 실패할 수 있기 때문에 반드시 try랑 함께 써준다.
if let data = data, let myPerson = try? decoder.decode(Person.self, from: data) {
print(myPerson.name)
print(myPerson.age)
}
🔍 CodingKey란?
서버에서 내려주는 키 값이 달라도 정상적으로 파싱할 수 있게 도와주는 프로토콜
struct Person: Codable { // Codable 프로토콜 채택
var name: String
var age: Int
enum CodingKeys: String, CodingKey { // enum을 통해 CodingKey 채택.
case name = "SeverName"
case age
}
}
let jsonString = """
{
"age" : 27,
"SeverName" : "Ari"
}
"""
// SeverName이라는 키값으로 정상적으로 파싱이 되는걸 볼 수 있다.
let decoder = JSONDecoder() // decoder 선언
var data = jsonString.data(using: .utf8) // String 타입을 data로 바꿔준다.
// 옵셔널바인딩을 통하여 data를 인스턴스로 디코딩하는 작업.
if let data = data, let myPerson = try? decoder.decode(Person.self, from: data) {
print(myPerson.name)
print(myPerson.age)
}
✔️ Reference
반응형
'Swift > iOS' 카테고리의 다른 글
[iOS] Bundle이 뭘까? (0) | 2021.09.28 |
---|---|
[iOS/Xcode] Auto Layout에 대해 알아보자. (1) | 2021.09.27 |
[Swift/iOS] FileManager로 파일 생성(쓰기), 읽기, 삭제하기 (3) | 2021.08.27 |
[Swift] 시간과 날짜를 다루는 타입에 대해서 알아보자. (0) | 2021.08.25 |
[Swift/iOS] 메모리를 관리해주는 ARC에 대해 알아보자. (0) | 2021.08.15 |
Comments