目录
1. JSONModel
2. MJExtension
原本使用的一直是JSONModel,因为后台的一次失误(数组类型的字段偶尔返回成字符串),造成数据解析不出来。
果断放弃使用JSONModel,改用MJExtension。
1. JSONModel
第一步 :cocoaPods引入
# JSONModel
pod 'JSONModel'
第二步:自定义模型
#import <JSONModel/JSONModel.h>
YTPersonModel : JSONModel
第三步:转换
字典转模型
// 方式一
PersonModel *personM=[[PersonModel alloc] initWithDictionary:dic error:nil]
// 方式二
_guideArr=[YTPublishDZModel arrayOfModelsFromDictionaries:gjArr error:nil];
// 模型转字典
NSDictionary* dict = [personM toDictionary];
// 模型转字符串
NSString* string = [personM toJSONString];
注意事项
1. 属性可选(有不需要和后台字段映射的属性)
// 方式一:指定属性可选
@property (strong, nonatomic) NSString<Optional>* name;
// 方式二:全部属性可选(推荐)
+(BOOL)propertyIsOptional:(NSString *)propertyName{
return true;
}
// 方式三:指定属性忽略
@property (strong, nonatomic) NSString<Ignore>* customProperty;
2.当和后台字段不一致时 (自定义属性:后台属性)
+(JSONKeyMapper *)keyMapper{
return [[JSONKeyMapper alloc]initWithModelToJSONDictionary:@{
@"themeId":@"id",
@"Description":@"description"
}];
}
// 如果只是将下划线转为驼峰,则使用
+(JSONKeyMapper *)keyMapper{
// 将后台返回的_a 改为 A (将驼峰模式改为下划线模式)
return [JSONKeyMapper mapperForSnakeCase];
}
3. 数组(类类型) 、(类类型的)属性 或 作其他处理 +
// initWithDictionary转换时,对(类类型的)属性不用做额外处理
对于数组(类类型)
@protocol NewsDetailItem
@end
@property(nonatomic, strong) NSArray<NewsDetailItem> *ewsDetailItemArray;
// 当使用arrayOfModelsFromDictionaries转换时
-(instancetype)initWithDictionary:(NSDictionary *)dict error:(NSError *__autoreleasing *)err{
self=[super initWithDictionary:dict error:err];
if(self){
_currentRoundM=[[ZYDDataScheduleItemModel arrayOfModelsFromDictionaries:@[dict[@"current_round"]] error:nil]firstObject];
//
NSArray *dayNumArr=dict[@"tripDayList"];
_tripDayList=[YTDayModel arrayOfModelsFromDictionaries:dayNumArr error:nil];
//
if(dict[@"readyTime"]){
_readyTime=[dict[@"readyTime"] intValue];
}else if(dict[@"redayTime"]){
_readyTime=[dict[@"redayTime"] intValue];
}
}
return self;
}
2. MJExtension
第一步 :cocoaPods引入
pod 'MJExtension'
第二步:自定义模型
BaseModel.h
#import <Foundation/Foundation.h>
@interface BaseModel : NSObject
@property (nonatomic, copy) NSString *ID;
@end
BaseModel.m
#import "BaseModel.h"
@implementation BaseModel
@end
第三步:转换
// 字典转模型
BaseModel *model = [BaseModel objectWithKeyValues:dict];
// 字典数组转模型数组
NSArray *selecteds = [BaseModel mj_objectArrayWithKeyValuesArray:dic[@"response"][@"selected"]
// 模型转字典
NSDictionary *personDict = personModel.keyValues;
// 模型数组转字典数组
NSArray *dictArray = [PersonModel keyValuesArrayWithObjectArray:personArray];
注意事项
1、当属性为类类型属性,不需做额外处理。
2、当属性是数组,元素类型为类类型。
+ (NSDictionary *)objectClassInArray{
return @{
@"personArray" : @"PersonModel",
@"teamArray" : @"TeamModel",
};
}
/*
另外2种方式(不推荐,要引入头文件):
+ (NSDictionary *)objectClassInArray{
return @{
@"personArray" : [PersonModel class],
@"teamArray" : [TeamModel class],
};
}
+ (Class)objectClassInArray:(NSString *)propertyName{
if ([propertyName isEqualToString:@"personArray"]) {
return [PersonModel class];
} else if ([propertyName isEqualToString:@"teamArray"]) {
return [TeamModel class];
}
return nil;
}
*/
3、当和后台字段不一致时
+ (NSDictionary *)replacedKeyFromPropertyName{
NSDictionary *dict = @{
@"ID": @[@"id",@"houseId"] ,
@"descriptions":@"description"
};
return dict;
}








网友评论