iOS 开发 oc 如何使用mjextension将服务器返回的字典中的元素转成model

199 阅读2分钟

在iOS开发中,使用MJExtension将服务器返回的字典中的元素转换为模型对象是一个常见的需求。以下是详细的步骤和方法:

1. 集成MJExtension

首先,需要将MJExtension集成到项目中。可以通过CocoaPods进行安装,只需在Podfile中添加以下代码:

pod 'MJExtension'

然后运行pod install命令来安装MJExtension。安装完成后,在需要使用MJExtension的文件中导入头文件:

#import "MJExtension.h"

2. 定义模型类

定义一个模型类来对应服务器返回的数据结构。例如,假设服务器返回的数据如下:

{

"name": "Jack",

"icon": "lufy.png"

}

可以定义一个User模型类:

// User.h

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *icon;

@end

3. 字典转模型

当从服务器获取到字典数据后,可以使用mj_objectWithKeyValues:方法将其转换为模型对象。例如:

NSDictionary *dict = @{

@"name" : @"Jack",

@"icon" : @"lufy.png"

};

User *user = [User mj_objectWithKeyValues:dict];

NSLog(@"name=%@, icon=%@", user.name, user.icon);

4. 字典数组转模型数组

如果服务器返回的是一个字典数组,可以使用mj_objectArrayWithKeyValuesArray:方法将其转换为模型数组。例如:

NSArray *dictArray = @[

@{

@"name" : @"Jack",

@"icon" : @"lufy.png"

},

@{

@"name" : @"Rose",

@"icon" : @"nami.png"

}

];

NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray];

for (User *user in userArray) {

NSLog(@"name=%@, icon=%@", user.name, user.icon);

}

5. 处理嵌套模型

如果字典中包含嵌套的字典或数组,需要在模型类中实现mj_objectClassInArray方法来指定嵌套对象的类。例如,假设服务器返回的数据如下:

{

"name": "Jack",

"icon": "lufy.png",

"cars": [

{

"brand": "Toyota",

"model": "Corolla"

},

{

"brand": "Honda",

"model": "Civic"

}

]

}

可以定义一个Car模型类和一个User模型类:

// Car.h

#import <Foundation/Foundation.h>

@interface Car : NSObject

@property (nonatomic, copy) NSString *brand;

@property (nonatomic, copy) NSString *model;

@end

// User.h

#import <Foundation/Foundation.h>

#import "Car.h"

@interface User : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *icon;

@property (nonatomic, strong) NSArray<Car *> *cars;

@end

// User.m

#import "User.h"

@implementation User

+ (NSDictionary *)mj_objectClassInArray {

return @{@"cars" : @"Car"};

}

@end

然后使用mj_objectWithKeyValues:方法进行转换:

NSDictionary *dict = @{

@"name" : @"Jack",

@"icon" : @"lufy.png",

@"cars" : @[

@{

@"brand" : @"Toyota",

@"model" : @"Corolla"

},

@{

@"brand" : @"Honda",

@"model" : @"Civic"

}

]

};

User *user = [User mj_objectWithKeyValues:dict];

NSLog(@"name=%@, icon=%@", user.name, user.icon);

for (Car *car in user.cars) {

NSLog(@"brand=%@, model=%@", car.brand, car.model);

}

6. 处理属性名不匹配的情况

如果字典中的键与模型属性名不匹配,可以在模型类中实现mj_replacedKeyFromPropertyName方法来指定映射关系。例如,假设服务器返回的数据如下:

{

"user_name": "Jack",

"user_icon": "lufy.png"

}

可以定义一个User模型类:

// User.h

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *icon;

@end

// User.m

#import "User.h"

@implementation User

+ (NSDictionary *)mj_replacedKeyFromPropertyName {

return @{@"name" : @"user_name", @"icon" : @"user_icon"};

}

@end

然后使用mj_objectWithKeyValues:方法进行转换:

NSDictionary *dict = @{

@"user_name" : @"Jack",

@"user_icon" : @"lufy.png"

};

User *user = [User mj_objectWithKeyValues:dict];

NSLog(@"name=%@, icon=%@", user.name, user.icon);

通过以上步骤,可以使用MJExtension将服务器返回的字典中的元素高效地转换为模型对象。