`

MJExtension使用指导(转)

 
阅读更多
MJExtension能做什么?
MJExtension是一套字典和模型之间互相转换的超轻量级框架
MJExtension能完成的功能

字典(JSON) --> 模型(Model)
模型(Model) --> 字典(JSON)
字典数组(JSON Array) --> 模型数组(Model Array)
模型数组(Model Array) --> 字典数组(JSON Array)
详尽用法主要参考 main.m中的各个函数 以及 NSObject+MJKeyValue.h

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 Ad : NSObject
@property (copy, nonatomic) NSString *image;
@property (copy, nonatomic) NSString *url;
@end

@interface StatusResult : NSObject
/** 存放着一堆的微博数据(里面都是Status模型) */
@property (strong, nonatomic) NSMutableArray *statuses;
/** 存放着一堆的广告数据(里面都是Ad模型) */
@property (strong, nonatomic) NSArray *ads;
@property (strong, nonatomic) NSNumber *totalNumber;
@end

@implementation StatusResult
// 实现这个方法的目的:告诉MJExtension框架statuses和ads数组里面装的是什么模型
/*    + (NSDictionary *)objectClassInArray{    
return @{         
@"statuses" : [Status class],         
@"ads" : [Ad class]    };
}
+ (Class)objectClassInArray:(NSString *)propertyName{    
if ([propertyName isEqualToString:@"statuses"]) {        
return [Status class];    
} else if ([propertyName isEqualToString:@"ads"]) {        
return [Ad class];    }    
return nil;}
*/

// 这个方法对比上面的2个方法更加没有侵入性和污染,因为不需要导入Status和Ad的头文件
+ (NSDictionary *)objectClassInArray{    
    return @{         
              @"statuses" : @"Status",         
              @"ads" : @"Ad"    
            };
}
@end

NSDictionary *dict = @{                       
@"statuses" : @[                           
                @{                                   
                   @"text" : @"今天天气真不错!",
                   @"user" : @{                                   
                                @"name" : @"Rose",
                                @"icon" : @"nami.png"                                                                                  
                              }                            
                 }, 

                 @{                               
                    @"text" : @"明天去旅游了", 
                    @"user" : @{                                                                   
                                 @"name" : @"Jack",                                       
                                 @"icon" : @"lufy.png"                               
                               }  
                   } 

                ],                       
 @"ads" :@[                           
           @{                               
              @"image" : @"ad01.png", 
              @"url" : @"http://www.ad01.com"                                                          
            }, 

           @{                               
              @"image" : @"ad02.png",                                   
              @"url" : @"http://www.ad02.com"                           
            }                       
          ],                       
 @"totalNumber" : @"2014"                    
};

         // 将字典转为StatusResult模型
         StatusResult *result = [StatusResult objectWithKeyValues:dict];
         NSLog(@"totalNumber=%@", result.totalNumber);
         // totalNumber=2014

         // 打印statuses数组中的模型属性
         for (Status *status in result.statuses) {    
                NSString *text = status.text;    
                NSString *name = status.user.name;    NSString *icon = status.user.icon;    
                NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);}
               // text=今天天气真不错!, name=Rose, icon=nami.png
               // text=明天去旅游了, name=Jack, icon=lufy.png

         // 打印ads数组中的模型属性
         for (Ad *ad in result.ads) {    
                 NSLog(@"image=%@, url=%@", ad.image, ad.url);}
                 // image=ad01.png, url=http://www.ad01.com
                 // image=ad02.png, url=http://www.ad02.com

核心代码3:

在模型内部实现+ (NSDictionary *)objectClassInArray方法
[StatusResult objectWithKeyValues:dict]

4.模型中的属性名和字典中的key不相同(或者需要多级映射)
@interface Bag : NSObject
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) double price;@end@interface Student : NSObject
@property (copy, nonatomic) NSString *ID;
@property (copy, nonatomic) NSString *desc;
@property (copy, nonatomic) NSString *nowName;
@property (copy, nonatomic) NSString *oldName;
@property (copy, nonatomic) NSString *nameChangedTime;
@property (strong, nonatomic) Bag *bag;
@end

@implementation Student
// 实现这个方法的目的:告诉MJExtension框架模型中的属性名对应着字典的哪个key
+ (NSDictionary *)replacedKeyFromPropertyName{    
     return @{                
               @"ID" : @"id",                
               @"desc" : @"desciption",                
               @"oldName" : @"name.oldName", 
               @"nowName" : @"name.newName",  
               @"nameChangedTime" : @"name.info.nameChangedTime",                                       
               @"bag" : @"other.bag"            
              };
}

@end

NSDictionary *dict = @{                       
                        @"id" : @"20",                       
                        @"desciption" : @"孩子",
                        @"name" : @{                                                         
                                     @"newName" : @"lufy", 
                                     @"oldName" : @"kitty",  
                                     @"info" : @{                                                                                                   
                                                  @"nameChangedTime" : @"2013-08"                            
                                                 }                       
                                    },                       
                        @"other" : @{                            
                                      @"bag" : @{                                
                                                  @"name" : @"小书包", 
                                                  @"price" : @100.7                                                              
                                                 }                       
                                     }                   
};

// 将字典转为Student模型
Student *stu = [Student objectWithKeyValues:dict];
// 打印Student模型的属性
NSLog(@"ID=%@, desc=%@, oldName=%@, nowName=%@, nameChangedTime=%@", stu.ID, stu.desc, stu.oldName, stu.nowName, stu.nameChangedTime);
// ID=20, desc=孩子, oldName=kitty, nowName=lufy, nameChangedTime=2013-08
NSLog(@"bagName=%@, bagPrice=%f", stu.bag.name, stu.bag.price);
// bagName=小书包, bagPrice=100.700000

核心代码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]



原文链接:http://www.jianshu.com/p/93c242452b9b
分享到:
评论

相关推荐

    我写的MJExtension的例子

    MJExtension内部使用了缓存机制,对于已经转换过的模型类和属性,第二次转换时会直接从缓存中获取,提高了性能。 9. **注意事项**: - 模型类的属性需要遵循KVC规则,即属性名需要符合驼峰命名法。 - 字典的键值...

    MJEXTENSION

    在【MJExtension-master】这个压缩包中,包含了MJExtension的源代码、示例工程以及相关的文档,可以帮助开发者更深入地理解和使用这个库。通过学习和应用MJExtension,可以提升iOS开发的生产力,让数据模型的处理变...

    MJExtension

    - **字典转模型(Dictionary to Model)**: MJExtension提供了一种简便的方式将NSDictionary对象转换为自定义的Model对象,只需一句话即可完成转换。 - **模型转字典(Model to Dictionary)**: 同样,模型对象...

    MJExtension工具类

    `MJExtension`是一个在iOS开发中广泛使用的轻量级模型数据转换框架,它极大地简化了Objective-C中的JSON序列化和反序列化的过程。这个工具类由著名iOS开发者马乔(Michael Jiang)创建,旨在提高开发效率,使得模型...

    用Object-C语言开发的一键Json转模型搭配开源库"MJExtension"使用

    为了简化这一过程,开发者可以使用开源库"MJExtension"来实现一键式的JSON转模型。"MJExtension"是一款非常流行的iOS开源库,它能够帮助开发者快速地将JSON数据转换为模型对象,同时支持模型对象转换为JSON数据。...

    Swift版的MJExtension,运行时、反射与一键字典模型互转.zip

    下面将详细探讨Swift版MJExtension的核心概念,包括运行时、反射以及字典模型互转。 1. **运行时(Runtime)** Swift运行时是Apple在Swift语言中实现的一种机制,它允许在程序运行过程中动态地查询和修改类型信息...

    iOS字典和模型之间互相转换

    MJExtension框架由Michael Jiang(也就是GitHub上的MJ老师)开发,它通过Category扩展了NSObject类,提供了方便快捷的字典转模型和模型转字典的方法。使用MJExtension,开发者只需要简单的几行代码,就可以实现复杂...

    iOS 超轻量级框架 MJExtension.zip

    iOS 超轻量级框架 MJExtension ,MJExtension 是 JSON 和模型之间最快捷方便的转换。

    MJExtension:JSON 和模型之间的转换框架-开源

    MJExtension 是一个超轻量级的框架,可以在字典和模型之间进行转换。 仅用一行代码编写模型的所有属性。 只需一行代码即可实现模型所有属性的编码(存档和取消存档)。 @objcattributes 应该添加到类和属性中以声明...

    MJExtension.zip

    MJExtension.zip,A fast, convenient and nonintrusive conversion framework between JSON and model. Your model class doesn't need to extend any base class. You don't need to modify any model file.

    MJExtension:JSON和模型之间的快速,便捷和非侵入式转换框架。 您的模型类不需要扩展任何基类。 您无需修改​​任何模型文件

    如果你的项目是用Swift写的Model,墙裂推荐使用已经对各种常用的数据场景进行扩展的单元测试简单易用,功能丰富,转换快速在Swift中使用框架[关于在Swift中使用MJExtension] ! 例: ! @objc属性应添加到类和属性中...

    swift-MJExtensionSwift3.0快速方便无损伤的JSON和模型之间的转换

    这个库是基于Objective-C的`MJExtension`库的Swift版本,简化了JSON与Swift对象之间的互转过程。 `MJExtensionSwift`的核心功能包括: 1. **序列化(Serialization)**:将Swift模型对象转换为JSON数据。这在你...

    iOS利用MJExtension框架归档反归档

    在程序中经常需要把一些信息保存到本地,如登录信息,MJExtension框架不仅可以可以将JSON转换为Model同时也可以借助该框架完成归档与反归档。本demo中的Wearinfo类可以直接移植到项目中直接使用。

    iOS-json转模型可视化工具

    这个工具支持两种常见的模型库——YYModel和MJExtension,它们都是iOS开发中广泛使用的JSON解析框架。 首先,YYModel是由YY团队开发的一个高性能的模型框架,它支持自动类型转换、自定义转换规则以及KVC/KVO等功能...

    IOS-JSON转换和解析

    本篇文章将深入探讨如何使用`NSJSONSerialization`在iOS应用中进行JSON转换和解析。 ### 1. JSON基本概念 JSON是一种基于文本的数据格式,它以键值对(key-value pairs)的形式存储数据,支持数组和对象。其语法...

    ios-CityListUseMJExtention.zip

    当接收到服务器返回的JSON数据,我们可以直接使用MJExtension的字典数组转模型数组的方法: ```swift NSData *jsonData = ...; // 从网络获取的JSON数据 NSArray *cityListData = [NSJSONSerialization ...

    ios-去除json解析出的字典货数组里的null值 MJExtension用法.zip

    最近想弄一下网络架构,无意之间发现,后台给的数据有的是null,用MJExtension转换模型之后,模型属性会为null。网上查了一下也没有什么好的去null方法,就自己写了一个。 这个demo也有一些MJExtension的常用法,...

    mac系统Json转Model工具

    在IT行业中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它易于人阅读和编写,同时也...同时,该工具支持JsonModel和MJExtension这两种广泛使用的库,进一步增加了它的适用性和灵活性。

Global site tag (gtag.js) - Google Analytics