티스토리 뷰

반응형


읽기전에, 본인이 사용하시는 Swift버전이...Swift 4.0이상인 분들은 이 글을 읽지 마시고 왕초보를 위한 Codable글을 읽으시길 바랍니다.


안녕하세요 :) JSON 파싱 1탄에 이어서 너무 늦게왔죠 제가 ㅠㅠㅠ

오늘 어떤분이 채널로 JSON파싱 2탄은 안올라오냐고 물어보셨어요 :)

제가 글을 그렇게 잘 쓰는 편은 아닌데, 봐주시고 기다려주시는 분들이 계시다는게 뭔가 확 느껴지더라구요!!

그래서 얼른 써야겠다는 생각을 했어요 ㅎㅎ


그러면 바로 시작해볼게요. 아직 JSON이 뭔지 모른다!! JSON이 어떤 구조인지 모른다!! 하시는 분들은

반드시 이 글을 읽고와주세요 :)


JSON에 대해서는 알고싶지 않고, 파싱만 일단 되게 하고싶어 ㅂㄷㅂㄷ 하시는 분들!! 계실거에요. 

저도 그랬어요. JSON이 어떻게 이루어져있는지는 관심없고 그냥 파싱하는법에만 급급했어요.

하지만 그게 잘못됐다는 걸 알았고, 정말 기초가 중요하다는 것을 요새 느끼고 있어요!

지금 마음이 급하다는 걸 정말 너무나도 잘 알지만, 급하게 생각하실 것 없어요. JSON이 어떤거고, 어떻게 이루어져 있고, 이런걸 하나하나 배우면 

나중에는 자연스럽게 파싱도 이해가 되실거에요.


자, 일단 인터넷에는 정말정말 많은 JSON파싱 방법이 있습니다. 그 중에 저는 일부의 방법밖에 지나지 않는 다는 것을 말씀드리고 싶어요.

솔직히 제가 지금부터 같이 해볼 코드가 "좋은코드"라고는 못하겠어요 ㅎㅎ..위험한 코드이기도 하구요.

근데, 제가 처음 JSON파싱을 접할때, 여러 코드들을 수없이 많이 봤는데 정말 뭔가 어렵더라구요...뭔가 제가 보기 쉬운 코드가 정말 별로 없었어요 ㅠㅠ

이때 JSON이 어떻게 이루어져있는지도 몰랐을때에요. 근데 JSON이 어떻게 이루어져있는지 알고나서는 뭔가 서서히 이해가가더라구요

그러니까!!! 제발 1탄 읽고오시는것을...추천드립니다.

아무튼 그래서 생각해봤는데, 일단. 위험한코드(fetal error가 날 수 있는 코드)를 먼저 해보고! 그 다음 차차 고쳐나가는 방식으로 글을 쓰려구요 ㅎㅎ..

이 글은 왕초보를 위한거니까요!!! 제가 어려웠던 부분을 쉽게 가르쳐드릴려고 합니다. 


너무 서론이 길었죠 ㅎㅎ..

진짜 시작해볼게요. 참고로 모든 파싱은 Swift언어로 진행합니다. 또한, 오늘은 네트워크를 쓰지 않고, 제 로컬파일에 있는 JSON파싱을 진행할거에요.


왕초보를 위한 JSON Parsing - 2(JSON 파싱)



ㅎㅎ일단 JSON을 파싱하려면 JSON파일이 있어야겠죠?

뭐를 할까 고민하다가 스택오버플로우 질문에 있는 ...JSON을 가져왔습니다.

출처 : https://stackoverflow.com/questions/24410881/reading-in-a-json-file-using-swift

{

  "person":[

     {

       "name": "Bob",

       "age": "16",

       "employed": "No"

     },

     {

       "name": "Vinny",

       "age": "56",

       "employed": "Yes"

     }

  ]

}    


자.. 오늘은 왕왕초보분들을 위한거니까 ㅎㅎ 제가 정말 막혔었던 부분이 어느것인지, 어느부분이 어려웠는지 알기때문에.. 하나하나 가르쳐드릴거에요!

자. JSON파싱 1탄을 읽고 오셨을거라...믿고......<왕초보를 위한 JSON 파싱 1탄 읽으러가기>



일단, 큰 객체 하나가 들어왔네요. {}로 전체가 묶여있는 것 보이시죠?

JSON에서 객체는 뭐라구요? name-value쌍이라구요 ㅎㅎ 역시나 "Person" : []이렇게 쌍으로 이루어져있네요. 이게 어려워 보이는 이유는..

이 배열([])안에 엄청나게 길게 뭔가가 들어있기 때문이죠.. 

잘 보시면, 객체안에 {}, {} 이렇게 객체가 두개가 들어있죠?

객체는 뭐라구요?? 네. name - value의 쌍이죠.~~이제 까먹으시면 안돼요.

역시나 {}안에는 쌍 형태로 값들이 들어가있네요 ㅎㅎ


자..서론은 이쯤하고, 진짜 파싱하러 가봅시다. 

일단 JSON파일부터 만드셔야겠죠? 

아무 텍스트편집기나 열어서(저는 Atom을 씁니다.) 

그리고, person.json으로 데스크탑이나, 원하는 곳에 저장해주세요. 저는 데스크탑에 했습니다. 

자 이제 단계별로 해볼거에요. 잘따라오세요.



1. 프로젝트를 연다.

이때, 본인은 Command Line Tool 프로젝트일 수도 있고, iOS 앱을 개발하는 Single View Application일 수도 있어요.

결과적으로 하는 방법은 동일한데,  Command Line Tool에서만 되는게 있고, Single View Application에서만 되는게 있습니다.

하지만 Command Line Tool, Single View Application 두군데서 모두 되는 방법을 일단 알려드릴게요.


아무 프로젝트나 열어주세요. 저는 Command Line Tool로 해볼게요.

처음 프로젝트를 시작하면, 

이렇게 되어있을거에요.



2. person.json에 있는 내용을 가져온다.

위에서 우리는 person.json이라는 파일을 만들었어요. 

일단 JSON파싱을 하려면, 이 person.json에 있는 "내용"을 가져와야해요. 당연하겠죠?


일단 이  person.json이 어느 디렉토리에 있는지 알아야합니다. 저는 Desktop에 있으니 


let FullPath = "/Users/Zedd/Desktop/person.json"


가 되겠네요.

하지만, 네. 위의 FullPath는 현재 String에 불과해요. 

그치만 우리는 String이 아니라, person.json이라는 "파일"에 있는 "내용"을 가지고오고 싶어요. 

그래서 우리는 FullPath에 해당하는 파일에 가서, 그 내용을 가져와야해요. 

if let contents = try? String(contentsOfFile: FullPath)

String에 contentsOfFile이라는 파라미터 이름이 있네요. 파라미터 이름만봐도, 그 파일안에 있는 내용을 가져올 것 같이 생겼죠?

우리는 <2. person.json에 있는 내용을 가져온다.>라는 미션을 완료한겁니다.


한번 contents를 print해볼까요? 

이야아아ㅏ~~~~~잘 나왔네요. 



3. person.json에서 가져온 "내용"을 "데이터화"해야한다.

하지만 유감스럽게도 이 상태에서는 JSON파싱을 진행할 수 없답니다. 

결과적으로 우리는 Swift에서 제공하는 JSONSerialization 이라는 것을 쓸거에요. JSONSerialization는  파라미터로 data를 받게되는데, 이 data는 Data타입이기 때문에, 위에서 받은 String타입인 person.json의 내용을 Data타입으로 바꿔줘야해요.


if let data = contents.data(using: .utf8){


위에서 contents는 방금 가져온 person.json의 String타입의 "내용"이죠? 

그것을 data라는 메소드를 이용해서 data화 시켜줬어요.


위에서는 이해를 돕기위해서 ㅎㅎ.. 둘로 나눠줬는데! 이해가 가셨다면!

if let data = try String(contentsOfFile: FullPath).data(using: .utf8)

이렇게 둘을 합쳐도 된답니다 XD


4. JSONSerialization을 사용하여 Foundation 객체화 시켜주자.

let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [String : Any]

JSONSerialization에는 jsonObject라는 메소드가 있는데, json데이터를 파라미터로 받아 Swift에서 가공/처리할 수 있는 Foundation객체로 만들어주는 역할을 해요. 

자세한 설명은 여기를 참고해주세요 :)


+ 지금 여기서 JSONSerialization을 사용했는데요, 이때는 Codable이 나오기 전이라 이걸 사용한건데..Swift4에서 Codable이라는게 나왔습니다. JSONSerialization을 사용할 필요없 굉장히 간단하게 JSON을 파싱할 수 있게 되었는데요. 

왕초보를 위한 Codable글을 참고하시면 될 것 같습니다.

개인적인 생각입니다만..Codable이 나온 지금..JSONSerialization를 사용하는건..좀...........ㅎ저는 무조건 정말 무조건!!! Codable을 사용하라고 말씀드리고싶네요.



5. 실행해보자.

import Foundation

let FullPath = "/Users/Zedd/Desktop/person.json"


if let data = try String(contentsOfFile: FullPath).data(using: .utf8) {


      let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [String : Any]

        print(json)

}


전체 코드입니다. 

결과를 한번 봐볼까요?


와아~~조금 정리된 느낌이네요.







※ 주의할점. Warning!


JSONSerialization하는 과정에서 정말 주의하셔야 할 점이 있습니다. 일단 제 경험상인데..


let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [String : Any]


바로 저 as! [String : Any]라고 생각되네요.

as는 타입캐스팅을 해주는 예약어입니다.

그럼 우리는 [String : Any], 즉 Dictionary의 key는 String타입이고, value는 아무거나 들어올 수 있어!! 라고 말하는 것이죠.


결과적으로, 하고싶은말은!! 여기 as 뒤에 올 타입은 파싱할 json파일과 형식이 맞아야 합니다.

다시 person.json을 볼게요.

전체적인 구조를 위에서 말했지만, 요약해서 보면, {"person" : [{},{}] } 이에요. 

Swift타입으로 보자면, [String :  Any]죠. 


-> 어떤 형식으로 json데이터를 Foundation객체로 가져올거야?

-> [String :  Any] 로 가져올게!

-> 어디~~ person.json을 보자 

-> {"person" : [{},{}] } 형식이구나!

-> 너가 말한 [String :  Any]타입으로 가져올 수 있겠어!!

-> 성공.


인터넷에 보면 json은 {"person" : [{},{}] }이런 형태만 있지 않답니다. 

예제를 한번 볼까요?


자, person.json과 다르게, 전체가 []. 즉, 배열로 묶여있네요. 

이 파일로 위에 있는 코드를 돌려볼까요? 


자. 이렇게 에러가 나게 됩니다. 


-> 어떤 형식으로 json데이터를 Foundation객체로 가져올거야?

-> [String :  Any] 로 가져올게!

-> 어디~~ area.json을 보자 

-> [{},{},{}] 형식이구나!

-> 너가 말한 [String :  Any]랑 다른데? 

-> 실패


area.json은 전체가 배열로 묶여있기 때문에, Swift의 Foundation객체로 가져오려면
[[String : Any]]형태로 가져와야합니다. 

import Foundation

let FullPath = "/Users/Zedd/Desktop/area.json"

if let data = try String(contentsOfFile: FullPath).data(using: .utf8) {

        let json = try! JSONSerialization.jsonObject(with: data, options: []) as! [[String : Any]]

        print(json)

}


즉, 이렇게요. 

그러면,


이렇게 오류없이 잘 가져와진것을 알 수 있습니다. 



글이 너무너무 길어져서...나눠서 써야겠어요..금방올게요! 진짜 하고싶은 파싱은...못했네요..

다음시간에 봐요 ㅎㅎ

도움이 되었으면 좋겠어요 :)💕




반응형