JSON data로부터 간단히 모델 클래스를 구현하기

Project 2012.04.13 16:30


코어데이터는 데이터를 다루기 위한 굉장히 편리한 도구이지만 데이터의 영속성이 필요하지 않은 경우에는

일부러 코어데이터를 쓰지 않아도 간단히 데이터 모델을 구현할 방법은 많이 있다.


모델클래스를 작성하고 JSON Data로부터 해당 데이터를 바인딩시키는 간단한 코드를 소개한다.

먼저 모델클래스이다.

보다시피 프로퍼티와 초기화 메소드를 하나 지정해둔다.


@interface User : NSObject


@property (nonatomic,strong) NSString *userId;

@property (nonatomic,strong) NSString *userName;

@property (nonatomic,strong) NSNumber *age;

@property (nonatomic,strong) NSString *imagePath;


-(id)initWithDictionary:(NSDictionary *)aDict;


@end

NSObject의 카테고리클래스중 하나인 NSKeyValueCoding은 유용한 메소드를 많이 가지고 있는데

그중 setValuesForKeysWithDictionary: 을 이용하면 dictionary로부터 자동으로 property값들을 세팅할수가 있다.

조심해야할 부분은 이름이 다르거나 가지고 있지 않은 프로퍼티일경우 예외를 내기 때문에

valueForUndefinedKey과 setValue: forUndefinedKey: 를 구현해두어야한다.

#import "User.h"


@implementation User

@synthesize userId,userName,age,imagePath;


-(id)initWithDictionary:(NSDictionary *)aDict

{

    self = [self init];

    if (self != nil) {

        if (aDict) {

            [self setValuesForKeysWithDictionary:aDict];

        }

    }

    return self;

}


- (id)valueForUndefinedKey:(NSString *)key

{

    NSLog(@"undefined key : %@",key);

    return  nil;

}


-(void)setValue:(id)value forUndefinedKey:(NSString *)key

{

    NSLog(@"undefined key : %@",key);

}


-(NSString *)description

{

    NSString *desc = @"";

    for (NSString *key in [PropertyUtil propertyNames:[self class]]) {

        desc = [desc stringByAppendingFormat:@"%@ : %@ ,",key,[self valueForKey:key]];

    }

    return desc;

}


@end

데이터초기화는 아래 한줄이면 된다.

User *user =  [[User alloc] initWithDictionary:jsonValue];



너무 간단한 코드들이라 특별히 이해하는데는 어렵지 않을듯하다.



p.s

직접구현한 모델일경우 프로퍼티내용을 description으로 표시하기가 귀찮을경우가 많은데 아래의 코드를 이용하면 클래스로부터 프로퍼티 이름을 배열로 받을수 있다.

#import <objc/runtime.h>

+ (NSArray *) propertyNames: (Class) class

    NSMutableArray *propertyNames = [[NSMutableArray alloc] init];

    unsigned int propertyCount = 0;

    objc_property_t *properties = class_copyPropertyList(class, &propertyCount);

    

    for (unsigned int i = 0; i < propertyCount; ++i) {

        objc_property_t property = properties[i];

        const char * name = property_getName(property);

        [propertyNames addObject:[NSString stringWithUTF8String:name]];

    }


    return [propertyNames copy];

}



Trackback 0 : Comment 0

블로그의 정체성

Diary 2012.03.04 23:13
 이 블로그의 시작은  내가 알고 알고 있는 지식 및 생각의 공유, 그리고 다른사람의 의견을 묻기위한 블로그로서 시작해서 기술블로그로 잠깐(!) 방향을 선회했다가 다시 공상블로그로 돌아갔다가 이젠 초심으로 돌아가 지식의 공유 및 다른사람들의 의견공유(지금 페이지 뷰를 보건데 아마 거의 없을듯하지만)를 목적으로 글을 써야겠다.
 뭐 잡담도 가끔(아니 대부분)..



 
Trackback 0 : Comment 0

아직도..

Diary 2012.03.04 22:50
정말 오랜만에 블로그에 글을 쓴다.

글을 쓰려고 블로그를 둘러보니 먼저 놀란것은 아직도 이명박의 시계는 356일이나 남았다는 것이다.
이 블로그 한창 쓸때 이명박이 대통령이었는데, 그 오랜 시간이 지나도 아직도 이명박이 대통령이구나.
5년이란 시간은 정말 긴시간인것같다.

5년내동안 내게 생긴일을 정리해보자면 (개인적인 일은 빼고)

1. 전직

 아마 지금 회사보다 큰회사는 그다지 많지 않을정도로 큰회사로 전직을 했다.
이전 회사생활보다 모든면에서 만족스러운 근무형태를 제공해주고 있다.
사내 카페라든지, 플렉서블 타임이라든지(장단점이있지만,늦잠이 많은 나에겐 장점이 많은듯),
뛰어난 동료라든지 , 자동화된 환경이라든지, 휴가 쓰는데 눈치안보이는점등등등.
아마 한동안은 전직생각은 안해도 될것같다. (글쎄?)

1-1. 프로젝트의 성공

 지금 하고 있는 프로젝트의 성공으로 나름 회사에서 위치를 인정받기 시작했다.
곧 월급도 오를것같고 인센티브 또한 최고평가점수에 맞게 받았고, 내 경력에도 많은 도움이 될것같다.
하지만 그에 따라 일도 점점 늘어나고 있는데다 유저도 점점 늘어나고 스펙도 점점 다양해져서
아마 올해동안에는 이 프로젝트만으로도 충분히 보낼수 있을것같다
아마 내년쯤엔 좀더 높은 자리에서 다른 프로젝트를 진행할수 있는 사람이 될수 있을지도 모르겠다.


2. 투잡

 몇년전부터 아는 사람들과 해오던 투잡일이 제작년 릴리즈를 해서 유료 카테고리 랭킹1위, 전체순위 3위에
올라간적이 있을정도로 잘 풀리는듯 했지만 현재는 다들 이런저런 개인적인 이유로 인해 근 1년이상 멈춘상태로 있다.
올해안에 이쪽일에도 집중을해서 좋은 결과를 낼생각이다. (돈은 별로 못벌었음. 서버비용정도는 벌은듯...)


이것이외에도 그동안 일어난일은 많이 있지만 지금 생각나는것은 이정도뿐인듯.


 
Trackback 0 : Comment 0