字典转模型:将类似下面的json文件转成对象模型,第一层为一个json字典json字典下有一个数组利用MJExtension完成对下列类型的json数据解析。
数组内是一个一个的小字典,目标是将字典转为模型。
情形一:将纯字典(字典内没有嵌套)转模型
1.创建RootModel对象,对象的属性对应字典内的key值。
2.请求网络数据用的是AFN的get请求。
//包含头文件
#import "MJExtension.h"
//1.创建可变数组用来容纳对象
NSMutableArray * models = [NSMutableArrayarray];
//2.responseObject为AFN请求返回的json格式数据,拿到json字典内的数组
NSArray * dicArr = responseObject[@"statuses"];
//3.遍历数组内的每一个字典
for (NSDictionary * dictin dicArr) {
//4.这是MJExtension的最重要的一句代码,作用是将一个纯的字典(或包含字典嵌套的字典)转成模型对象。
RootModel * model = [RootModelobjectWithKeyValues:dict];
//5.将转成的对象放到数组内
[modelsaddObject: model];
}
//说明:
//1.程序进行到此步就已经完成字典转模型的任务,即可以面向模型开发。
//2.后续需要做的就是数组models回传给控制器,将数组内的对象添加到控制器的数据源数组.
//3.添加到数据源数组时按一定的顺序(最新数据添加在前端,旧数据添加在尾端),包含最新数据的RootModel对象永远在数据源数组的最前端。
//4.以上是基于MVC模型开发。若是基于MVVM模型开发还需要做的就是将RootModel对象包装成RootModelFrame对象。在控制器的数据源数组内存放的也是RootModelFrame对象。
情形二:将字典(字典内嵌套字典)转模型。
1.创建RootModel对象,对象的属性对应字典内的key值。创建SecondModel对象,对象的属性对应字典内的key值。
//说明:
//代码的书写与情形一完全相同。
//字典1内包含字典2对象,并且字典1和字典2都有对应的模型。在RootModel内写属性时需注意不能写NSDictionary * user;而是改为SecondModel * model;这样MJExtension会自动将字典1内的字典2也转为模型。是可以多级嵌套使用的。
情形三:字典(字典内嵌套数组)模型
1.创建RootModel对象,对象的属性对应字典内的key值。创建ThirdModel对象,对象的属性对应字典内的key值。
//说明:
//代码的书写与情形一完全相同。
//如果不对数组pic_urls做处理的话RootModel内的属性NSArray * pic_urls;只是一个数组,数组内也只是字典而不会转为模型。
//我们想看到的结果是数组内不是字典而是模型对象,ThirdModel。这时就需要遵守MJExtension的一个协议并实现协议方法。实现此方法后即可达到目的。
//代码如下:
@interface RootModel :NSObject<MJKeyValue>
- (NSDictionary *)objectClassInArray{
return@{@"pic_urls":[CZPhotoclass]};
}
最后总结:
以上总结只是分情形给大家介绍MJExtension的简单使用,其实MJExtension还提供了一个更好用的方法可以直接将数组内的字典转为模型而不需要遍历数组。MJExtension已经将遍历的过程帮我们封装好了,但是转对象的字典内有数组的话遵从协议实现协议方法是不可缺的:
+ (NSArray *)objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray;
+ (NSArray *)objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray
{
// 1.判断真实性
NSString *desc = [NSStringstringWithFormat:@"keyValuesArray is not a keyValuesArray - keyValuesArray不是一个数组, keyValuesArray is a %@ - keyValuesArray参数是一个%@", keyValuesArray.class, keyValuesArray.class];
MJAssert2([keyValuesArray isKindOfClass:[NSArray class]], desc,nil);
// 2.创建数组
NSMutableArray *modelArray = [NSMutableArrayarray];
// 3.遍历
for (NSDictionary *keyValuesin keyValuesArray) {
if (![keyValuesisKindOfClass:[NSDictionaryclass]])continue;
id model = [selfobjectWithKeyValues:keyValues];
[modelArray addObject:model];
}
return modelArray;
}
// 一行代码搞定
NSArray * array = [RootModel objectArrayWithKeyValuesArray:dicArr];