새소식

iOS/Swift

[Swift] Codable vs JSONSerialization

  • -

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

 

GitHub - kimkhuna/ExchangeRateCalculator

Contribute to kimkhuna/ExchangeRateCalculator development by creating an account on GitHub.

github.com

 

 

 

 

 

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

 

GitHub - kimkhuna/exchangerate: 환율 계산기

환율 계산기. Contribute to kimkhuna/exchangerate development by creating an account on GitHub.

github.com

 

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
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.