iOS面試題收集(之MJExtension 字典轉模型)

MJExtension是一套字典和模型之間互相轉換的超輕量級框架

MJExtension能完成的功能

字典(JSON) --> 模型(Model)

模型(Model) --> 字典(JSON)

字典數組(JSON Array) --> 模型數組(Model Array)

模型數組(Model Array) --> 字典數組(JSON Array)

JSON array -> model array【字典數組轉成模型數組】

NSArray *dictArray = @[
                         @{
                             @"name" : @"Jack",
                             @"icon" : @"lufy.png"
                         },
                         @{
                             @"name" : @"Rose",
                             @"icon" : @"nami.png"
                         }
                     ];

// JSON array -> User array
NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray];
// Printing
for (User *user in userArray) {
    NSLog(@"name=%@, icon=%@", user.name, user.icon);
}
// name=Jack, icon=lufy.png
// name=Rose, icon=nami.png

Model -> JSON【模型轉成字典】

// New model
User *user = [[User alloc] init];
user.name = @"Jack";
user.icon = @"lufy.png";

Status *status = [[Status alloc] init];
status.user = user;
status.text = @"Nice mood!";

// Status -> JSON
NSDictionary *statusDict = status.mj_keyValues;
NSLog(@"%@", statusDict);
/*
 {
 text = "Nice mood!";
 user =     {
 icon = "lufy.png";
 name = Jack;
 };
 }
 */

// More complex situation
Student *stu = [[Student alloc] init];
stu.ID = @"123";
stu.oldName = @"rose";
stu.nowName = @"jack";
stu.desc = @"handsome";
stu.nameChangedTime = @"2018-09-08";

Bag *bag = [[Bag alloc] init];
bag.name = @"a red bag";
bag.price = 205;
stu.bag = bag;

NSDictionary *stuDict = stu.mj_keyValues;
NSLog(@"%@", stuDict);
/*
{
    ID = 123;
    bag =     {
        name = "\U5c0f\U4e66\U5305";
        price = 205;
    };
    desc = handsome;
    nameChangedTime = "2018-09-08";
    nowName = jack;
    oldName = rose;
}
 */

常見用法

  • key替換,比如ID和id
1.在模型類.m文件引入"MJExtension.h"
2.實現方法
+ (NSDictionary *)replacedKeyFromPropertyName {
    return @{@“非關鍵字的屬性名” : @“數組的key”};
}
+ (NSDictionary *)replacedKeyFromPropertyName{ // 模型的desc屬性對應著字典中的description
    return @{@"desc" : @"description",@"ID" : @"id"};
}
方法將model文件中定義的字段名轉化為與請求數據中相同的,使兩者的內部相同,只是名稱不同

通過遇到有的字段是一個數組,數組中又存放了其他的數據模型對象,可以通過以下方法將其關聯

+(NSDictionary *)objectClassInArray{
    return @{@"businesses" : [Busnisses class]};
}

實例一<模型中還有模型數組>

.h文件
#import <Foundation/Foundation.h>
#import "HWFindHeaderseItem.h"

@interface HWFindResponseItem : NSObject

@property(nonatomic, strong) HWFindHeaderseItem *header; // 直接是字典 直接定義要轉的模型類型
@property(nonatomic, strong) NSArray *chics;    // 是模型數組 需要在.m文件中重寫objectClassInArray方法
@property(nonatomic, strong) NSArray *featured;
@end
.m文件
#import "HWFindResponseItem.h"
#import <MJExtension/MJExtension.h>
#import "HWFindChicsItem.h"
#import "HWFindFeaturesItem.h"

@implementation HWFindResponseItem

+ (NSDictionary *)objectClassInArray{
    return @{@"chics" : [HWFindChicsItem class], @"featured" : [HWFindFeaturesItem class]};
}
@end

實例二<模型中屬性與系統屬性同名>

.h文件
#import <Foundation/Foundation.h>

@interface HWFindHeaderseItem : NSObject

@property(nonatomic, strong) NSString *title;
@property(nonatomic, strong) NSString *desc; // 與系統屬性重名 需要在.m文件中重寫replacedKeyFromPropertyName告知
@property(nonatomic, strong) NSArray *photos;
@end
.m文件
#import "HWFindHeaderseItem.h"
#import <MJExtension/MJExtension.h>

@implementation HWFindHeaderseItem
+ (NSDictionary *)replacedKeyFromPropertyName{ // 模型的desc屬性對應著字典中的description
    return @{@"desc" : @"description"};
}
- (void)setTitle:(NSString *)title {
    _title = title;
    NSLog(@"%@", title);
}
@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容