본문 바로가기

iOS/Objective-C

Objective-C) JSON을 Decoding 해보자

 

 

안녕하세요 :) 소들입니다🐮

오늘은 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 allocinit];
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 하기 성공~~~~~~~~

 

 

 

 

.

.

.

 

틀린 내용이나 피드백 환영 ~_~

 

ㅅ썸네일 없어서 투척



Calendar
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
최근 댓글
Visits
Today
Yesterday