'NSJSONSerialization'에 해당되는 글 1건

  1. 2012.08.28 iOS5에서 NSJSONSerialization을 사용해서 JSON 다루기 예제
iOS2012. 8. 28. 09:47

iOS5 이전에는 JSON API가 private API가 되어서 사용할 수 없었기 때문에, yajl, json-framework, jsonTouch 등 써드파티 json 라이브러리들을 사용해야했다. 써드파티 라이브러리이기 때문에 외부 라이브러들을 불러와아야했고, ilnk를 걸어줘야하는 등 개발에 필요한 것들이 많았었다. 하지만 iOS5에서 부터는 NSJSONSerialization API를 사용할수 있게 되었다. 

NSJSONSerialization은 다른 써더파티 라이브러리와 마찬가지로 NSDicationary와 NSArray로 형태의 객체로 바로 매핑할 수 있다. 또한 모든 객체는 NSString, NSNumber, NSArray, NSDictionary 또는 NSNull로 매핑된다. 그리고 모든 객체의 키이름은 NSString으로 사용된다.간단히 

NSJSONSerialization을 사용하는 방법에 대한 예제를 준비했다. 
{
   "name" : "saltfactory",
   "e-mail" : "saltfactory@gmail.com"
}
이라는 간단한 JSON을 파싱하는 테스트를 위해서 UnitTest로 준비했다.

JSON 문자열을 NSDictionary 객체로 매핑하기 위해서는 다음과 같은 단계가 필요하다. NSJSONSerialization에서 에러를 담을 NSError가 필요하기 때문에 NSError 변수를 하나를 만든다. 그리고 JSON문자열을 NSJSONSerialization에서 사용할 수 있는 NSData로 변형시켜야한다. 이렇게 준비된 data와 error를 JSONObjectWithData:options:error: 메소드를 이용해서 NSDictionary로 바로 매핑할 수 있다. 예제는 JSON문자열을 NSJSONSerialization을 이용해서 NSDictionary로 파싱해서 name이라는 키의 값과 @"saltfactory"라는 문자열이 같은지 단위테스트를 한 것이다. 결과는 올바르게 해석되어 매핑되었기 때문에 단위테스트가 성공적으로 끝나게 된다.

 - (void)testParsingJSON

{

    NSString *jsonString = @"{\"name\":\"saltfactory\",\"e-mail\":\"saltfactory@gmail.com\"}";

    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

    NSError *error;

    NSDictionary *jsonInfo = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];

    

    NSAssert([[jsonInfo valueForKey:@"name"] isEqualToString:@"saltfactory"], @"not equals");

}


다음은 NSDictionary의 객체로 JSON 문자열을 생성하는 방법이다. 이 방법은 JSON의 문자열을 NSDictionary로 매핑하는 방법과 반대로 실행하면 된다. 우선 키이름과 NSString, NSNumber, NSArray, NSDictionary, NSNull 중에 하나의 객체를 값으로 가지는 NSDictionary를 만든다. 그리고 그 NSDictionary 객체를 NSData로 생성하는데 이때 NSJSONSerialization의 dataWithJSONObject:options:error: 메소드를 사용해서 객체를 JSON data로 생성한다. 이때 옵션으로 NSJSONWritingPrettyPrinted라는 옵션을 사용했는데, 이 옵션을 사용한 이유는 JSON 문자열을 만들때 whitespace가 포함되어 가독석을 높이기 위해서 이 옵션을 사용했다. 마지막으로 이 data를 이용해서 NSString을 만들면 된다. 이렇게 생성된 JSON 문자열을 출력해보면 처음 테스트하려던 JSON과 동일한 형태의 JSON이 출력되는 것을 확인할 수 있다. 

- (void)testGeneratingJSON

{

    NSError *error;

    NSString *jsonInfo = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"saltfactory",@"name",@"saltfactory@gmail.com",@"e-mail"nil];

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonInfo options:NSJSONWritingPrettyPrintederror:&error];

    NSString *jsonString = [[NSString allocinitWithData:jsonData encoding:NSUTF8StringEncoding];

    NSLog(@"jsonString => %@", jsonString);


Posted by 다오나무