-
Swift4 - JSON 인코더와 디코더Programming/iOS 2018. 4. 24. 05:07반응형
1. 데이터를 받아올 스트럭트를 만들어준다.
이 때, 인코더와 디코더가 둘다 가능케 하려면 Codable 하나만 가능케하려면 Encodable 또는 Decodable 을 적용한다.
struct MerchantInfo : Codable{
var IsSuccess : Bool?
var Code : String?
var Message : String?
var ErrorMessage : String?
var ErrorStackTrace : String?
var list : String?
var key : AddNewInfo?
var obj : Info?
}
//MARK: Properties
struct AddNewInfo : Codable{
var ConfirmationCode: String?
var SsnOrTax: String?
}
struct Info : Codable {
var merchantType : Int?
var idx : Int?
var UserType : Int?
var Status : String?
여기서 AddNewInfo는 Key 값으로 사용한다. : Encodable
MerchantInfo는 데이터를 받아올 때 쓴다. : Decodable
2. URL과 HTTP를 설정해준다.
let urlMerchantCheck = $YOUR_URL$
guard let url = URL(string: urlMerchantCheck) else { return self.data }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
print("request addValue done")
let newInfo = AddNewInfo(ConfirmationCode : firstData, SsnOrTax : secondData)
POST 방식으로 application/json으로 설정하였다.
이미지등을 받거나 업로드 할때에는 이렇게 하는 것이 아닌. almofire를 사용한다. 천만배 편하다.
AddNewInfo에 키값을 넣는다.
3. 키 값을 Encoding 하여 JSON으로 바꾼다.
do {
let jsonBody = try JSONEncoder().encode(newInfo)
request.httpBody = jsonBody
} catch {print("error : ")
print(error)
}
jsonBody 가 키값을 갖고있는 데이터 값이다.
그 데이터를 request에 넣는다.
4. 세션을 연결하고 키를 입력하여 데이터를 받아온다.
let session = URLSession.shared
var merchantInfo: MerchantInfo
let task = session.dataTask(with: request) { (data, _, _) in
guard let data = data else {return}
do {
//JSONDecoder
merchantInfo = try JSONDecoder().decode(MerchantInfo.self, from: data)
print(merchantInfo)
} catch {
print(error)
}
}; task.resume()
merchantInfo에 struct 구조로 값이 들어가 있다.
확인 방법은
1. struct print
print(checkAPI)
2. string으로 변환 후 print
var backToString = String(data: data, encoding: String.Encoding.utf8) as String
print(backToString)
이렇게 Encoder와 Decoder를 알아보았다.
단 task가 Asynchronous Session Type 타입이라 세션이 끝나지 않은 상황에서
}; task.resume()
이 부분 아래부터 위와 상관없이 진행이 된다.
이것을 막고 싶다면
DispatchSemaphore
를 사용한다.
1. 변수 선언
// 1. To Wait for Task
let semaphore = DispatchSemaphore(value: 0)
2. 신호를 줌
// 2. Wait for Task
semaphore.signal()
3. 신호를 받을 때까지 기다림.
// 3. Wait for Task
semaphore.wait()
<전체 코드>
let urlMerchantCheck = $YOUR_URL$
guard let url = URL(string: urlMerchantCheck) else { return nil}
var request = URLRequest(url: url)
var merchantInfo: MerchantInforequest.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
print("request done")
// 1. To Wait for Task
let semaphore = DispatchSemaphore(value: 0)
do {
let jsonBody = try JSONEncoder().encode(merchantInfo.obj)
request.httpBody = jsonBody
print(jsonBody)
} catch { print(error) }
let session = URLSession.shared
let task = session.dataTask(with: request) { (data, _, _) in
guard let data = data else {return}
do {
//JSONDecoder
merchantInfo = try JSONDecoder().decode(MerchantInfo.self, from: data)
print(checkAPI)
} catch {
print(error)
}
//var backToString = String(data: data, encoding: String.Encoding.utf8) as String
//print(backToString)
// 2. Wait for Task
semaphore.signal()
}; task.resume()
// 3. Wait for Task
semaphore.wait()
1.
반응형'Programming > iOS' 카테고리의 다른 글
2021 애플 9월 이벤트 정리 (아이폰13, 아이패드 미니, 애플워치7세대) (0) 2021.09.15 Mac M1 Homebrew, Ruby, RVM, Fastlane 설치 방법 (0) 2021.05.02 ios swift http, https webView info.plist 설정하기 (0) 2018.05.12 ios swift4 키보드 숨기기 두가지 방법. keyboard dismiss. (0) 2018.05.11 swift javascript 연동, 함수 호출하기 (0) 2018.05.03