꾸준히 안타치기
JSON / Codable - 부스트코스 예제 본문
반응형
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