iOS之模型转换(JSONModel 、 MJExtension)

目录
  1. JSONModel
  2. MJExtension

原本使用的一直是JSONModel,因为后台的一次失误(数组类型的字段偶尔返回成字符串),造成数据解析不出来。
果断放弃使用JSONModel,改用MJExtension。

1. JSONModel

第一步 :cocoaPods引入

# JSONModel
pod 'JSONModel'

第二步:自定义模型

#import 
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* name;

// 方式二:全部属性可选(推荐)
+(BOOL)propertyIsOptional:(NSString *)propertyName{
    return true;
}

// 方式三:指定属性忽略
@property (strong, nonatomic) NSString* 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  *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 
@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;
}

你可能感兴趣的:(iOS之模型转换(JSONModel 、 MJExtension))