[Swift] Codable vs JSONSerialization
2022. 10. 15. 14:55
Codable
- 자신을 변환하거나 외부 표현으로 변환할 수 있는 타입
- Encodable & Decodable(프로토콜)이 합쳐진 개념
- Class, Struct, enum에 모두 사용 가능
- mvvm 패턴에서 사용
- Encodable : 인코딩할 수 있는 타입
- Decodable : 디코딩할 수 있는 타입
※ 인코딩 : 사람이 인지하지 못하고 컴퓨터가 이해할 수 있도록 바꿔주는 것
디코딩 : 바이트 형식을 문자(문자열)로 변환
- json data
{
bkpr = 383;
"cur_nm" = "\Uc544\Ub78d\Uc5d0\Ubbf8\Ub9ac\Ud2b8 \Ub514\Ub974\Ud568";
"cur_unit" = AED;
"deal_bas_r" = "383.95";
"kftc_bkpr" = 383;
"kftc_deal_bas_r" = "383.95";
result = 1;
"ten_dd_efee_r" = 0;
ttb = "380.11";
tts = "387.78";
"yy_efee_r" = 0;
},
- model(struct) 선언
struct Money: Decodable{
let cur_nm: String? // 나라명
let cur_unit: String? // 국가/통화명
let deal_bas_r: String? // 매매기준율
}
- decoder 이용
class WebService{
func getMoney(url: URL, completion: @escaping([Money]?) -> ()){
URLSession.shared.dataTask(with: url){
(data, response, error) in
if let error = error {
print(error.localizedDescription)
completion(nil)
}
else if let data = data{
let moneyList = try? JSONDecoder().decode([Money].self, from: data)
completion(moneyList)
}
}.resume()
}
}
- Github
https://github.com/kimkhuna/ExchangeRateCalculator
JSONSerialization
- JSON 데이터를 Parsing 할 때 사용
- JSON을 Array 또는 Dictionary로, Array 또는 Dictionary를 JSON으로 바꿔주는 객체
- Array, Dictionary만 사용 가능
- [String : Any], [[String : Any]] 형태
- 데이터를 받을 Dictionary와 Array 선언
var lists = [[String:Any]]()
var countrys = [String]()
var basePrices = [String]()
var units = [String]()
- JSONSerialization 이용
let json = try! JSONSerialization.jsonObject(with: response.data!, options: []) as! [[String:Any]]
self.lists = json
if let list = self.lists as? [[String:Any]]{
for indexs in list{
self.countrys.append(indexs["cur_nm"] as! String)
self.basePrices.append(indexs["kftc_deal_bas_r"] as! String)
self.units.append(indexs["cur_unit"] as! String)
}
}
- Dictionary로 Parsing
[["ttb": 384.61,
"result": 1,
"kftc_deal_bas_r": 388.5,
"ten_dd_efee_r": 0,
"cur_unit": AED,
"kftc_bkpr": 388,
"yy_efee_r": 0,
"bkpr": 388,
"cur_nm": 아랍에미리트 디르함,
"deal_bas_r": 388.5,
"tts": 392.38]]
- ["cur_nm"]과 ["kftc_deal_bas_r"], ["cur_unit"]을 선언해준 Array
→ countrys[], basePrices[], units[]에 append
- Github
https://github.com/kimkhuna/exchangerate
728x90
'iOS > Swift' 카테고리의 다른 글
[Swift] URLSession https 인증서 신뢰 (0) | 2022.11.20 |
---|---|
[Swift] URLSession (0) | 2022.11.17 |
[Swift] 접근제어 (0) | 2022.09.28 |
[Swift] 인스턴스 (0) | 2022.09.28 |
[Swift] Extension (0) | 2022.09.27 |