iOS Json decoding to struct

운영 체제: macOS Monterey 12.5.1
사용 버전: Xcode 13.4.1, Swift

iOS Json decoding to struct을 알아보겠습니다.


API 서버에서 보통 Json 형식으로 보냅니다. 이것을 swift는 이해할 수 없습니다. 그래서 이해할 수 있는 struct로 변환해서 사용해야 합니다.
이번 시간에는 json을 struct로 변경하는 방법을 알아보겠습니다.







임시로 사용해 볼 Json을 만듭니다.

Json은 Key와 Value가 존재합니다.  Key에는 글자 형식이 들어가고, Value에는 Int, Double 또는 Float, String, Bool, Json Array 값이 들어갈 수 있습니다. 위의 Json에는 Json Array 값은 사용하지 않았습니다. 밑에서 다룰 때 다시 보시게 될 겁니다.


예전에는 이러한 Json을 불러오기 힘들었는데, Codable이라는 Protocol을 만들면서 쉽게 만들 수 있게 되었습니다.


Struct를 하나 만들어 줍니다.









Json과 동일한 이름으로 변수를 만들어줍니다. 여기서 문제가 발생합니다. 

7 번째 줄 Nick name의 경우 공백이 존재함으로 변수로 바로 만들 수 없습니다. 그리고 6 번째 줄 class의 경우도 이미 지정된 이름으로 바로 사용할 수 없습니다.


여기서 필요한 게 CodingKeys입니다.

enum을 사용하고 String과 CodingKey를 상속받습니다.

case에는 같은 변수 면 그냥 변수 이름만 적고 다른 경우 24 번째 줄처럼 원래 Json 키값을 적어줍니다.








이제 준비는 끝났습니다. Decoder를 만들어서 Decode를 해주면 Json이 Struct로 변환됩니다.

decode에는 타입이 들어가고, from에는 json을 넣어줍니다. 저는 PersonInfo.self를 넣었고 from에는 data를 넣었습니다.









만약 Array 배열 형식으로 온다면 어떻게 해야 할까요?

아래처럼 배열로 온다고 칩시다. 









이러한 경우는 이 부분만 변경해 주면 됩니다.

PersonInfo를 대괄호 []로 감싸줍니다.








Json 안에 또 Json이 존재한다면 어떻게 해야 할까요?

아래 Json을 봅시다.

9 번째 줄 lightsaber의 값이 Json으로 변경되었습니다.








이 경우에는 lightsaber 안에 있는 Json 또한 Struct로 만들어야 합니다.

lightSaber 안에 있는 Json을 위한 Struct입니다.









그다음 전체 Json 용 struct입니다.

28 번째 줄 lightsaber 쪽에 struct 이름인 lightSaber가 적힌 게 보입니다.








Struct로 변환하는 방법은 똑같습니다. 불러와진 게 보입니다.










만약 dictionary처럼 Json이 보내진다면 dictionary 형식으로 받을 수도 있습니다.








두 가지 방법이 있습니다.

1. 전체를 기준으로 나누기.

2. success, loading을 기준으로 나누기.



1. 전체를 기준으로 나누기는 다음과 같이 합니다.

똑같이 적은 상태에서 62 번째 줄처럼 형식을 Dictionary로 줍니다.












2. success, loading을 기준으로 나누기는 다음과 같이 합니다.

전체를 위한 struct를 하나 더 만듭니다. 저는 DataStruct로 만들었습니다.








출력은 다음과 같이 합니다.






끝.


카테고리: iOS


댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

Python OpenCV 빈 화면 만들기

tensorflow tf.random.uniform()

Android Notification with Full Screen

KiCad 시작하기 2 (PCB 만들기)

Android Minimum touch target size

Python bs4.SoupStrainer()

KiCad 시작하기 4 (기존 회로도 수정 및 추가)

음악 총보(Score), 파트보(Part)

tensorflow tf.expand_dims()