꾸준히 안타치기

JSON / Codable - 부스트코스 예제 본문

iOS/서버연동

JSON / Codable - 부스트코스 예제

글자줍기 2022. 3. 15. 16:05
반응형

https://www.boostcourse.org/mo326/lecture/20146?isDesc=false 

 

iOS 앱 프로그래밍

부스트코스 무료 강의

www.boostcourse.org

예제를 실행하기 위해 에셋에 제이슨 파일 추가 

제이슨형태

/**
 {
         "name":"하나",
         "age":22,
         "address_info": {
             "country":"대한민국",
             "city":"울산"
         }
     },
 */
더보기
[
	{
		"name":"하나",
		"age":22,
		"address_info": {
			"country":"대한민국",
			"city":"울산"
		}
	},
	{
		"name":"주현",
		"age":34,
		"address_info": {
			"country":"대한민국",
			"city":"김해"
		}
	},
	{
		"name":"영선",
		"age":26,
		"address_info": {
			"country":"대한민국",
			"city":"부천"
		}
	},
	{
		"name":"미정",
		"age":16,
		"address_info": {
			"country":"대한민국",
			"city":"부산"
		}
	},
	{
		"name":"은희",
		"age":36,
		"address_info": {
			"country":"대한민국",
			"city":"성남"
		}
	},
	{
		"name":"현국",
		"age":54,
		"address_info": {
			"country":"프랑스",
			"city":"파리"
		}
	},
	{
		"name":"현진",
		"age":34,
		"address_info": {
			"country":"미국",
			"city":"LA"
		}
	},
	{
		"name":"은지",
		"age":45,
		"address_info": {
			"country":"영국",
			"city":"런던"
		}
	},
	{
		"name":"재명",
		"age":24,
		"address_info": {
			"country":"인도네시아",
			"city":"발리"
		}
	},
	{
		"name":"민지",
		"age":42,
		"address_info": {
			"country":"중국",
			"city":"북경"
		}
	},
	{
		"name":"종명",
		"age":14,
		"address_info": {
			"country":"일본",
			"city":"도쿄"
		}
	},
	{
		"name":"진성",
		"age":16,
		"address_info": {
			"country":"베트남",
			"city":"하노이"
		}
	},
	{
		"name":"완복",
		"age":24,
		"address_info": {
			"country":"미국",
			"city":"하와이"
		}
	},
	{
		"name":"미진",
		"age":27,
		"address_info": {
			"country":"대한민국",
			"city":"울산"
		}
	}
]

Friend.swift 를 생성하고, 구조체를 만든다. 

import Foundation

/**
 {
         "name":"하나",
         "age":22,
         "address_info": {
             "country":"대한민국",
             "city":"울산"
         }
     },
 */

// codable 프로토콜을 준수한다.
struct Friend: Codable {
    
    struct Address: Codable {
        let country: String
        let city: String
    }
    
    let name: String
    let age: Int
    let address_info: Address
}

스토리보드에서 뷰컨드롤러에 테이블뷰 추가, 테이블뷰 셀 추가 - 셀 Subtitle , cell로 작성

ViewController.swift에서 테이블뷰 아이비아울렛 연결, 셀이름 작성

import UIKit

class ViewController: UIViewController,UITableViewDataSource{
   //테이블뷰 연결
    @IBOutlet weak var tableView: UITableView!
    // 셀이름
    let cellIdentifier: String = "cell"
	// 제이슨을 담을 배열생성
    var friends: [Friend] = []

제이슨을 가져오려면 jsonDecoder가 필요함, friends라는 이름의 제이슨 데이터를 가져와 꺼낸뒤, 제이슨 디코딩을 한다음 테이블 뷰셀에 넣는다.

// 뷰가로딩된 이후에 해야할일!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //json디코더가 필요하다 , 데이터 에셋에 저장되어 있는 friends라는 이름의 제이슨 데이터를 가져와 꺼냄 ->셀에 넣기
        let jsonDecoder: JSONDecoder = JSONDecoder()
        guard let dataAsset: NSDataAsset = NSDataAsset(name:"friends") else {
            return
        }
        
        do{
            self.friends = try jsonDecoder.decode([Friend].self, from: dataAsset.data)
        }catch{
            print(error.localizedDescription)
        }
        self.tableView.reloadData()
        
    }

테이블뷰 내용

class ViewController: UIViewController,UITableViewDataSource{
   //테이블뷰 연결
    @IBOutlet weak var tableView: UITableView!
    // 셀이름
    let cellIdentifier: String = "cell"
    // 제이슨을 담을 배열생성
    var friends: [Friend] = []
    
    
    // 테이블뷰 행************************************************************************************
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // friends만큼 리턴
        return self.friends.count
    }
    
    // 테이블뷰 셀
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
    UITableViewCell {
        let cell: UITableViewCell = 
        tableView.dequeueReusableCell(withIdentifier: self.cellIdentifier,
                                                                  for: indexPath)
        // 친구목록 가져와 뿌리기
        let friend: Friend = self.friends[indexPath.row]
        
        // 셀스타일 subtitle
        cell.textLabel?.text = friend.name + "(\(friend.age)"
        cell.detailTextLabel?.text = friend.address_info.city + "," 
        +friend.address_info.country
        
        return cell
    }

제이슨을 가져와 디코더로 변화한뒤에, friends배열에 담고, 테이블뷰 셀에 뿌린다.

다시 스토리보드로 가서 뷰컨트롤러에 테이블뷰를 연결한다.

테이블뷰를 선택하고, 노랑 네모로 끌어서 데이터 소스를 연결한다.

 

여기까지 실행한 화면

전체소스

Friend.swift

import Foundation

/**
 {
         "name":"하나",
         "age":22,
         "address_info": {
             "country":"대한민국",
             "city":"울산"
         }
     },
 */

// codable 프로토콜을 준수한다.
struct Friend: Codable {
    
    struct Address: Codable {
        let country: String
        let city: String
    }
    
    let name: String
    let age: Int
    let address_info: Address
}

viewController.swift

import UIKit

class ViewController: UIViewController,UITableViewDataSource{
   //테이블뷰 연결
    @IBOutlet weak var tableView: UITableView!
    // 셀이름
    let cellIdentifier: String = "cell"
    // 제이슨을 담을 배열생성
    var friends: [Friend] = []
    
    
    // 테이블뷰 행************************************************************************************
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // friends만큼 리턴
        return self.friends.count
    }
    
    // 테이블뷰 셀
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: self.cellIdentifier,
                                                                  for: indexPath)
        // 친구목록 가져와 뿌리기
        let friend: Friend = self.friends[indexPath.row]
        
        // 셀스타일 subtitle
        cell.textLabel?.text = friend.name + "(\(friend.age))"
        cell.detailTextLabel?.text = friend.address_info.city + "," + friend.address_info.country
        
        return cell
    }
    
    // 뷰가로딩된 이후에 해야할일!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //json디코더가 필요하다 , 데이터 에셋에 저장되어 있는 friends라는 이름의 제이슨 데이터를 가져와 꺼냄 ->셀에 넣기
        let jsonDecoder: JSONDecoder = JSONDecoder()
        guard let dataAsset: NSDataAsset = NSDataAsset(name:"friends") else {
            return
        }
        
        do{
            self.friends = try jsonDecoder.decode([Friend].self, from: dataAsset.data)
        }catch{
            print(error.localizedDescription)
        }
        self.tableView.reloadData()
    }
}

2. 코딩키로 이름 맞추기 

import Foundation

/**
 {
         "name":"하나",
         "age":22,
         "address_info": {
             "country":"대한민국",
             "city":"울산"
         }
     },
 */

// codable 프로토콜을 준수한다.
struct Friend: Codable {
    
    struct Address: Codable {
        let country: String
        let city: String
    }
    
    let name: String
    let age: Int
    let addressInfo: Address //addressInfo로 수정********************
    
    // 코드를 보기좋게 하기위해서 미리 합쳐서 리턴
    var nameAndAge: String {
        return self.name + "(\(self.age))"
    }
    
    var fullAddress: String {
        return self.addressInfo.city + ", " + self.addressInfo.country
    }
    
    //address_info를 addressInfo로 변경해주는 코딩키를 사용********************
    enum CodingKeys: String, CodingKey {
        case name, age
        case addressInfo = "address_info"
    }
}

뷰컨트롤러로 가서 셀에 뿌려지는 값을 수정한다.

  // 테이블뷰 셀
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: self.cellIdentifier,
                                                                  for: indexPath)
        // 친구목록 가져와 뿌리기
        let friend: Friend = self.friends[indexPath.row]
        
        // 셀스타일 subtitle
//        cell.textLabel?.text = friend.name + "(\(friend.age))"
//        cell.detailTextLabel?.text = friend.address_info.city + "," + friend.address_info.country
        
        // 로 변경
        cell.textLabel?.text = friend.nameAndAge
        cell.detailTextLabel?.text = friend.fullAddress
        
        return cell
    }

 

코딩키 적용한 전체코드

Friend.swift

import Foundation

/**
 {
         "name":"하나",
         "age":22,
         "address_info": {
             "country":"대한민국",
             "city":"울산"
         }
     },
 */

// codable 프로토콜을 준수한다.
struct Friend: Codable {
    
    struct Address: Codable {
        let country: String
        let city: String
    }
    
    let name: String
    let age: Int
    let addressInfo: Address //addressInfo로 수정********************
    
    // 코드를 보기좋게 하기위해서 미리 합쳐서 리턴
    var nameAndAge: String {
        return self.name + "(\(self.age))"
    }
    
    var fullAddress: String {
        return self.addressInfo.city + ", " + self.addressInfo.country
    }
    
    //address_info를 addressInfo로 변경해주는 코딩키를 사용********************
    enum CodingKeys: String, CodingKey {
        case name, age
        case addressInfo = "address_info"
    }
}

viewController.swift

import UIKit

class ViewController: UIViewController,UITableViewDataSource{
   //테이블뷰 연결
    @IBOutlet weak var tableView: UITableView!
    // 셀이름
    let cellIdentifier: String = "cell"
    // 제이슨을 담을 배열생성
    var friends: [Friend] = []
    
    
    // 테이블뷰 행************************************************************************************
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // friends만큼 리턴
        return self.friends.count
    }
    
    // 테이블뷰 셀
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: self.cellIdentifier,
                                                                  for: indexPath)
        // 친구목록 가져와 뿌리기
        let friend: Friend = self.friends[indexPath.row]
        
        // 셀스타일 subtitle
//        cell.textLabel?.text = friend.name + "(\(friend.age))"
//        cell.detailTextLabel?.text = friend.address_info.city + "," + friend.address_info.country
        
        // 로 변경
        cell.textLabel?.text = friend.nameAndAge
        cell.detailTextLabel?.text = friend.fullAddress
        
        return cell
    }
    
    // 뷰가로딩된 이후에 해야할일!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //json디코더가 필요하다 , 데이터 에셋에 저장되어 있는 friends라는 이름의 제이슨 데이터를 가져와 꺼냄 ->셀에 넣기
        let jsonDecoder: JSONDecoder = JSONDecoder()
        guard let dataAsset: NSDataAsset = NSDataAsset(name:"friends") else {
            return
        }
        
        do{
            self.friends = try jsonDecoder.decode([Friend].self, from: dataAsset.data)
        }catch{
            print(error.localizedDescription)
        }
        self.tableView.reloadData()
    }
}
반응형

'iOS > 서버연동' 카테고리의 다른 글

Alamofire 사용법  (0) 2022.03.15
RESTful API/ GET/ POST Contents - Type의 차이점  (0) 2022.03.15
Alamofire 예제  (0) 2022.01.05
JSON / Codable - Encoding and Decoding  (0) 2022.01.04
API Alamofire / SwiftJSON 사용법 공부하기*****  (0) 2021.12.27
Comments