iOS JSON转Model的库 MJExtension的基本使用指导

MJExtension能做什么?

  1. MJExtension是一套字典和模型之间互相转换的超轻量级框架
  2. MJExtension能完成的功能
     字典(JSON) --> 模型(Model)
  3. 模型(Model) --> 字典(JSON
  4. 字典数组(JSON Array) --> 模型数组(Model Array
  5. 模型数组(Model Array) --> 字典数组(JSON Array


MJExtension和JSONModel、Mantle等框架的区别

1. 转换速率:

最近一次测试表明:MJExtension > JSONModel > Mantle

各位开发者也可以自行测试

2.具体用法:

JSONModel

要求所有模型类必须继承自JSONModel基类

Mantle

要求所有模型类必须继承自MTModel基类

MJExtension

不需要你的模型类继承任何特殊基类,毫无污染,毫无侵入性



如何使用MJExtension

方法一:cocoapods导入:pod 'MJExtension'

方法二:手动导入

将MJExtensionExample/MJExtensionExample/MJExtension文件夹中的所有源代码拽入项目中

导入主头文件:#import "MJExtension.h"

MJExtension.h

MJConst.h               

MJConst.m

MJFoundation.h               

MJFoundation.m

MJIvar.h               

MJIvar.m

MJType.h                

MJType.m

NSObject+MJCoding.h     

NSObject+MJCoding.m

NSObject+MJIvar.h       

NSObject+MJIvar.m

NSObject+MJKeyValue.h   

NSObject+MJKeyValue.m



1.最简单的字典转模型

typedef enum {
    SexMale,    
    SexFemale} Sex;
@interface User : NSObject
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *icon;
@property (assign, nonatomic) int age;
@property (assign, nonatomic) double height;
@property (strong, nonatomic) NSNumber *money;
@property (assign, nonatomic) Sex sex;
@end

NSDictionary *dict = @{
                        @"name" : @"Jack",                 
                        @"icon" : @"lufy.png",               
                        @"age" : @20,               
                        @"height" : @"1.55",               
                        @"money" : @100.9,               
                        @"sex" : @(SexFemale)            
};

// 将字典转为User模型
User *user = [User objectWithKeyValues:dict];
NSLog(@"name=%@, icon=%@, age=%d, height=%@, money=%@, sex=%d", user.name, user.icon, user.age, user.height, user.money, user.sex);
// name=Jack, icon=lufy.png, age=20, height=1.550000, money=100.9, sex=1

核心代码1:

[User objectWithKeyValues:dict]


2.模型中嵌套模型

@interface Status : NSObject
/** 微博文本内容 */
@property (copy, nonatomic) NSString *text;
/** 微博作者 */
@property (strong, nonatomic) User *user;
/** 转发的微博 */
@property (strong, nonatomic) Status *retweetedStatus;
@end

NSDictionary *dict = @{               
@"text" : @"是啊,今天天气确实不错!", 
@"user" : @{                   
             @"name" : @"Jack",                   
             @"icon" : @"lufy.png"                
           },               
@"retweetedStatus" : @{                   
                        @"text" : @"今天天气真不错!",                   
                        @"user" : @{                       
                                    @"name" : @"Rose",                       
                                    @"icon" : @"nami.png"                    
                                   }                
                       }            
};

// 将字典转为Status模型
Status *status = [Status objectWithKeyValues:dict];
NSString *text = status.text;
NSString *name = status.user.name;
NSString *icon = status.user.icon;
NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
// text=是啊,今天天气确实不错!, name=Jack, icon=lufy.png

NSString *text2 = status.retweetedStatus.text;
NSString *name2 = status.retweetedStatus.user.name;
NSString *icon2 = status.retweetedStatus.user.icon;
NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2);
// text2=今天天气真不错!, name2=Rose, icon2=nami.png

核心代码2

[Status objectWithKeyValues:dict]


3.模型中有个数组属性,数组里面又要装着其它模型

@interface Status : NSObject
/** 微博文本内容 */
@property (copy, nonatomic) NSString *text;
/** 微博作者 */
@property (strong, nonatomic) User *user;
/** 转发的微博 */
@property (strong, nonatomic) Status *retweetedStatus;
@end

NSDictionary *dict = @{               
@"text" : @"是啊,今天天气确实不错!", 
@"user" : @{                   
             @"name" : @"Jack",                   
             @"icon" : @"lufy.png"                
           },               
@"retweetedStatus" : @{                   
                        @"text" : @"今天天气真不错!",                   
                        @"user" : @{                       
                                    @"name" : @"Rose",                       
                                    @"icon" : @"nami.png"                    
                                   }                
                       }            
};

// 将字典转为Status模型
Status *status = [Status objectWithKeyValues:dict];
NSString *text = status.text;
NSString *name = status.user.name;
NSString *icon = status.user.icon;
NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
// text=是啊,今天天气确实不错!, name=Jack, icon=lufy.png

NSString *text2 = status.retweetedStatus.text;
NSString *name2 = status.retweetedStatus.user.name;
NSString *icon2 = status.retweetedStatus.user.icon;
NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2);
// text2=今天天气真不错!, name2=Rose, icon2=nami.png

核心代码3:

在模型内部实现+ (NSDictionary *)objectClassInArray方法

[StatusResult objectWithKeyValues:dict]


4.模型中的属性名和字典中的key不相同(或者需要多级映射)

@interface Status : NSObject
/** 微博文本内容 */
@property (copy, nonatomic) NSString *text;
/** 微博作者 */
@property (strong, nonatomic) User *user;
/** 转发的微博 */
@property (strong, nonatomic) Status *retweetedStatus;
@end

NSDictionary *dict = @{               
@"text" : @"是啊,今天天气确实不错!", 
@"user" : @{                   
             @"name" : @"Jack",                   
             @"icon" : @"lufy.png"                
           },               
@"retweetedStatus" : @{                   
                        @"text" : @"今天天气真不错!",                   
                        @"user" : @{                       
                                    @"name" : @"Rose",                       
                                    @"icon" : @"nami.png"                    
                                   }                
                       }            
};

// 将字典转为Status模型
Status *status = [Status objectWithKeyValues:dict];
NSString *text = status.text;
NSString *name = status.user.name;
NSString *icon = status.user.icon;
NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);
// text=是啊,今天天气确实不错!, name=Jack, icon=lufy.png

NSString *text2 = status.retweetedStatus.text;
NSString *name2 = status.retweetedStatus.user.name;
NSString *icon2 = status.retweetedStatus.user.icon;
NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2);
// text2=今天天气真不错!, name2=Rose, icon2=nami.png

核心代码4:

在模型内部实现+ (NSDictionary *)replacedKeyFromPropertyName方法

[Student objectWithKeyValues:dict]



5.将一个字典数组转成模型数组

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

// 将字典数组转为User模型数组
NSArray *userArray = [User objectArrayWithKeyValuesArray:dictArray];
// 打印userArray数组中的User模型属性
for (User *user in userArray) {   
      NSLog(@"name=%@, icon=%@", user.name, user.icon);}
      // name=Jack, icon=lufy.png
      // name=Rose, icon=nami.png

核心代码5:

[User objectArrayWithKeyValuesArray:dictArray]



6.将一个模型转成字典

// 新建模型
  User *user = [[User alloc] init];
user.name = @"Jack";
user.icon = @"lufy.png";

Status *status = [[Status alloc] init];
status.user = user;
status.text = @"今天的心情不错!";


// 将模型转为字典
NSDictionary *statusDict = status.keyValues;
NSLog(@"%@", statusDict);
/*{ text = "今天的心情不错!";    
    user = {        
             icon = "lufy.png";        
             name = Jack;    
           };
  }*/

// 多级映射的模型
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 = @"小书包";
bag.price = 205;
stu.bag = bag;
NSDictionary *stuDict = stu.keyValues;NSLog(@"%@", stuDict);
/*
{    desciption = handsome;    
       id = 123;    
       name = {        
                info ={            
                nameChangedTime = "2018-09-08";        
                       };        
                newName = jack;        
                oldName = rose;    
               };    
                other = {  
                          bag ={            
                                 name = "小书包";            
                                 price = 205;        
                               };    
                        }; 
               }
 */

核心代码6:

status.keyValues、stu.keyValues



7.将一个模型数组转成字典数组

// 新建模型数组
  User *user1 = [[User alloc] init];
user1.name = @"Jack";
user1.icon = @"lufy.png";

User *user2 = [[User alloc] init];
user2.name = @"Rose";
user2.icon = @"nami.png";

NSArray *userArray = @[user1, user2];
// 将模型数组转为字典数组
NSArray *dictArray = [User keyValuesArrayWithObjectArray:userArray];
NSLog(@"%@", dictArray);
/*(    
{        icon = "lufy.png";        name = Jack;    },    
{        icon = "nami.png";        name = Rose;    }  )*/

核心代码7:

[User keyValuesArrayWithObjectArray:userArray]



以下是原文地址,排版真的是不忍直视,这样看上去舒服多了





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值