上一片文章:iOS Json转Model (一)中提及了jsonModel这个开源库:这里介绍一下它的(嵌套解析)用法。
以下是从服务器获得的数据:
1.首先声明一个继承自JSONModel的基类:
//.h
#import "JSONModel.h"
@interface BaseModel : JSONModel
@end
//.m
@implementation BaseModel
/**用于将服务器传过来的以下划线字段转化为模型的驼峰类型:比如上面的available_predeposit, 但模型中我们的字段如果我们写为(通常我们都这么写)availablePredeposit,如果不重写该函数则availablePredeposit就无法赋值*/
+ (JSONKeyMapper *)keyMapper {
return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
}
/**声明模型中的字段可以存在或不存在服务器的字段,
否则模型不会被赋值,比如说下面的Model中如果有字段code1,如果没这样重写这个方法,这整个model就不会被赋值,解析的结果是nil。
*/
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
return YES;
}
@end
二、我们发现数据的根字段有:info、code以及data三个字段,而data下又有member字段,member下又有不可分割的字段
所以我们需要声明三个模型
模型 1
@interface Model : BaseModel
@property (nonatomic, strong) DataModel *data; //注意字段“data”必须和服务器的字段相同,不能写成data1或其他的
@property (nonatomic, copy) NSString *info; //
@property (nonatomic, assign) NSInteger code;
@end
模型 2
@interface DataModel : BaseModel
@property (nonatomic, strong) MemberModel *member;
@end
模型 3
@interface MemberModel : BaseModel
@property (nonatomic, copy) NSString *points;
@property (nonatomic, copy) NSString *mobile;
@property (nonatomic, copy) NSString *nick;
@property (nonatomic, copy) NSString *id;
@property (nonatomic, copy) NSString *avatar;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *availablePredeposit;
@end
Model *model = [[Model alloc] initWithDictionary:dataDic error:nil]; //这里的dataDic就是从服务器放回的数据
然后mode中的所有字段都被赋值了,然后你需要name的时候,mode.data.member.name就可以, 是不是既方便又结构清晰。