ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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: MerchantInfo


            request.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. 





















    반응형

    댓글

Designed by Tistory.