2014년 2월 25일 화요일

[iOS] NSJSONSerialization 예제

옛날 옛적(?)에 iOS용 앱을 만들 때 JSON을 파싱하거나 인코딩 하려면 SBJson 이나 JSONKit 같은 외부 코드가 필요했다. 하지만 (제법 오래 전에) Cocoa 프레임워크에서 자체적으로 JSON에 관련된 프레임웍을 제공하기 시작했다. 그 이름하여 NSJSONSerialization 클래스이다.

성능 면에서는 그다지 좋은 평가를 받진 못 하지만 최소한 별 다른 외부 코드를 가져다가 쓸 필요도 없고, 덩치 큰 JSON을 사용할 일도 별로 없어서 성능 문제에 관해서는 그냥 무시해도 된다.

JSON 데이터를 파싱 할 때는 아래와 같은 식으로 이용 할 수 있다.
NSData *jsonData = ...; // 이 jsonData가 JSON 문자열이 들어있는 객체
NSError *error = nil;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData 
                                                     options:kNilOptions 
                                                       error:&error];
if (error) {
    NSLog(@"이거 JSON 아닌 것 같은데요?");
}
그다지 복잡하지는 않다. options도 그다지 설명할 필요성을 느끼질 못 하겠다.

다만 여기서는 NSDictionary 타입으로 받아왔지만 JSON의 형태에 따라 NSArray가 될 수도 있는데 이건 사용하는 프로토콜에 따라 알아서 결정해야 한다.

반대의 경우, 즉 Objective-C로 사용하는 NSArray 라던가 NSDictionary 객체를 JSON 문자열 데이터로 인코딩 하는 경우는 아래와 같다.
NSDictionary *json = ...; // 인코딩 하려는 사전 타입 객체
NSError *error = nil;
NSData *jsonObj = [NSJSONSerialization dataWithJSONObject:json 
                                                  options:0 
                                                    error:&error];
if (error) {
    NSLog(@"Failed to encode JSON with object: %@", json);
    return nil;
}
이렇게 하면 jsonObj라는 NSData 타입 객체가 생성된다. 이걸 가지고 어딘가에 보내든 저장하든 마음대로 구워삶으면 된다.

참고로 options에 0을 넘겼는데 여기다 NSJSONWritingPrettyPrinted 를 넣어주면 JSON 문자열을 들여쓰기와 개행문자(\n)를 넣어서 예쁘게 만들어준다. 대체로 Pretty Print 라는 표현은 사람이 알아보기 좋게라는 의미로 통용되고 있다는 점을 생각하자. 대신 예쁘게 만들어 주는 댓가는 데이터 사이즈가 좀 커진다는 점이다. -_-;;;

관련 링크: [iOS] SBJson - JSON Framework

댓글 없음 :