一般模型屬性的名稱必須與字典或數組的名稱是一致的,不然則會出錯。但由於字典或數組中的某些名稱會與xcode衝突,因此咱們能夠經過MJExtension更換模型屬性名稱數組
在模型的.m文件實現 -(NSDictionary *)replacedKeyFromPropertyName { return @{@"ID":@"id",@"test":@"mytest"}; }
例子一:能夠多重字典轉換爲模型,不管字典裏面包括多少層字典 NSDictionary *dict = @{ @"id" : @"123424324", @"text" : @"哈哈哈哈哈,天氣真好", @"user" : @{ @"idstr" : @"987766", @"name" : @"搞笑排行榜", @"profile_image_url" : @"http://abc.png" } }; HWStatus *status = [HWStatus objectWithKeyValues:dict]; 例子二: @property (nonatomic, copy) NSString *name; @property (nonatomic, strong) NSArray *books; NSDictionary *dict = @{ @"name" : @"張三", @"books" : @[ @{ @"name" : @"葵花1", @"price" : @"10.6" }, @{ @"name" : @"葵花2", @"price" : @"10.9" }, @{ @"name" : @"葵花3", @"price" : @"17.6" }, @{ @"name" : @"葵花4", @"price" : @"14.4" } ] }; HWPerson *person = [HWPerson objectWithKeyValues:dict]; 由於MJ不能知道NSAarry *books這個的模型是HWBooks,因此沒法NSAarry *books轉爲模型。即咱們要告知編譯器。 只要咱們在HWPerson.m文件中加上下面方法。 - (NSDictionary *)objectClassInArray { return @{@"books" : [HWBook class]}; }
一個字典對應一個模型,多個字典轉化爲多個模型,再將全部模型加入一個數組xcode
原理: //一個微博字典含有一個statuses數組,responseObject默認返回20條微博,因此dictArray有20組statuses數組 NSArray *dictArray = responseObject[@"statuses"]; //statuses數組裏的數據是字典,因此將字典轉爲模型,再將全部模型加入一個數組,方便UITableViewCell使用 for (NSDictionary *dict in dictArray) { WBStatuse *status = [WBStatuse objectWithKeyValues:dict]; [self.listArray addObject:status]; }
封裝後: NSArray *listArray = [MyModel objectArrayWithKeyValuesArray:responseObject[@"statuses"]]; 例如數據是: { "statuses": [ { "created_at": "Tue May 31 17:46:55 +0800 2011", "id": 11488058246, "text": "求關注。", "source": "<a href="http://weibo.com" rel="nofollow">新浪微博</a>", "favorited": false, } xxxx.... ]
- (id)initWithCoder:(NSCoder *)decoder { if (self = [super init]) { [self enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) { if (ivar.isSrcClassFromFoundation) return; ivar.value = [decoder decodeObjectForKey:ivar.name]; }]; } return self; } /** * 將對象寫入文件的時候調用 */ - (void)encodeWithCoder:(NSCoder *)encoder { [self enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) { if (ivar.isSrcClassFromFoundation) return; [encoder encodeObject:ivar.value forKey:ivar.name]; }]; } 或者在實現文件直接使用宏 MJCodingImplementation