안녕하세요 :) 소들입니다🐮
오늘은 Objective-C에서 어떻게 JSON을 Decoding 하는지
알아볼 거예여!!!!!!!!!!!!!!!
Encoding 때와 마찬가지로 Decoding 또한
NSJSONSerialization
라는 클래스를 사용할 거예요:)
뭐.............. Swift에선 Codable 같은 거 썼다고
Objective-C도 그럴거라 생각하면 절대 안 돼여ㅎㅎ.......
옵젝씨는 뭐다?????? 유물이다~~!!
고로, Decoding은 해주지만
실제 Class건 Struct에 파싱하는 건 알아서 해야 합니다 .. ^^하하
혹시 JSON에 대한 기초가 없으신 분이라면,
JSON이 도대체 뭘까? 이 포스팅을 꼭 읽고 와주세여~~
모든 포스팅은 편의 말투로 합니다~!!
1. JSON Decoding이 뭔가요?
자, 먼저 iOS에서 JSON Decoding 한다는 게 무슨 말이냐면,

위 그림처럼
NSData를 Array나 Dictionary로 바꾸는 것
을 말함!!!
Objective-C에서 JSON 객체, JSON 배열을 다룰 때
Array
Dictionary
계열로 다루기 때문에, JSON을 Decoding 하면 이 두개중 하나로 Return됨!
또한 이 NSData라는 것은 당연히
아무 NSData이면 안 되고, JSON 형태의 NSData이어야 함!
(만약 이해가 안간다면, Encoding 편에서 자세히 설명해놨으니 보고 오3)
2. JSON Decoding 메서드 살펴보기
우리가 Decoding에 사용할 메서드는 다음과 같은데

파라미터 하나하나씩 살펴보자 :)
2-1. data : 첫 번째 파라미터
먼저, 첫 번째 파라미터로 Server에서 받은 JSON 형식의 NSData를 넣어주면 됨
만약, JSON 형식이 아닌 NSData를 넣으면 어케됨??
테스트 해보니께

Encoding처럼 에러가 나진 않는데, Decoding 실패로 빠짐!!
아니 우린 JSON Encoding이니까, JSON 형태의 NSData를 넣어주셈!!
나는 예제라 Server에서 받은 데이터가 없기 때문에,
|
NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc] init];
myDictionary[@"name"] = @"Sodeul";
myDictionary[@"gender"] = @"female";
NSData *JSONData = [NSJSONSerialization dataWithJSONObject:myDictionary options:NSJSONWritingPrettyPrinted error:&error];
|
이렇게 직접 JSON 형식의 NSData를 만들어서 테스트 하겠음!!
2-2. options : 두 번째 파라미터
자, 먼저 Option이 뭐가 있냐면,

이렇게 총 3가지 Option이 있음
NSJSONReadingMutableContainers
파싱된 데이터의 최상위 객체 타입을 Mutable로 지정한다
우리가 JSON Decoding을 하면, Decoding 성공 시
NSArray or NSDictionary로 Return 되는데,
이 Immutable 속성들을 NSMutableArray, NSMutableDictionary로 변환해주는 옵셔임!
테스트해보니까 옵션을 주지 않았을 땐

Immutable Dictionary 형태로 Decoding되어 나온 Dictionary에 값 추가가 불가하지만,
이 옵션을 주면

Mutable Dictionary 형태라 값 추가가 가능함~!!!!
NSJSONReadingMutableLeaves
JSON 객체의 leaf 문자열이 MutableString로 지정한다
..? leaf 문자열이 모야..?
JSON 객체라니까 Dictionary를 말하는 것일테고,
Key, Value 중 하나를 말하는 것 같은데..
Key는 어차피 String만 가능하니까 이 String을 MutableString으로 한단 건지,
Value 중 String 값을 MutableString으로 한단 건지
잘 모르겠음ㅎ;
NSJSONReadingAllowFragMents
최상위 객체의 타입을 NSArray, NSDictionary 외의 타입도 허용한다
이거 이런 옵션인데
Deprecated 되었으니까 사용하지 맙시다~~
+ kNilOptions
아무런 Option도 주고싶지 않을 때 사용하면 됨!!!
kNilOptions 또는 0이라고 하면 아무런 Option도 주지 않음
(가독성 상 kNilOptions라고 합시다 :))
2-3. error : 세 번째 파라미터
Error 처리는 NSError 객체 하나 만드시면 댐 :)
|
NSError *error = nil;
|
자 파라미터 살펴보기 끝!
3. 본격적으로 Decoding을 해보자
매우 간단
앞에서 만들어놨던 거 그대로 대입하면 됨
|
NSDictionary *JSONDictionary = [NSJSONSerialization JSONObjectWithData:JSONData options:0 error:&error];
|
만약 error가 nil이면 Decoding에 성공한 것!
성공했을 때, 제대로 만들어졌는지 String으로 찍어보면,
|
if (error != nil) {
NSLog(@"jsonData = %@", JSONDictionary);
}
|
결과가

짠!!!!!!
Objective-C로 Decoding 하기 성공~~~~~~~~
.
.
.
틀린 내용이나 피드백 환영 ~_~

ㅅ썸네일 없어서 투척
'iOS > Objective-C' 카테고리의 다른 글
| Objective-C) 프로퍼티 (1/2) - 인스턴스 변수와 프로퍼티 (8) | 2020.12.06 |
|---|---|
| Objective-C) Category와 Extension (4) | 2020.12.06 |
| Objective-C) JSON을 Encoding 해보자 (0) | 2020.12.04 |
| Objective-C) C++ 사용하기 (0) | 2020.12.02 |
| Objective-C) ARC와 Toll-Free Bridging (0) | 2020.11.30 |