OC中第三方库MJExtension的使用
MJExtension是一套常用的"字典和模型之间互相转换"的框架,在项目中也使用过,现在记录一下。随着Swift的普及,在Swift中也有一个类似功能的框架HandyJSON 也非常好用。有空我也会介绍一下这个框架。
MJExtension 能完成的功能
<1> 字典转模型
<2>模型转字典
<3>字典数组->模型数组
<4>模型数组->字典数组
一 字典转模型
//字典转模型
- (void) dicToModel {
//简单的字典
NSDictionary *dict_user = @{
@"name" : @"Jack",
@"icon" : @"lufy.png",
@"age" : @,
@"height" : @"1.55",
@"money" : @100.9,
@"sex" : @(SexFemale),/* 枚举需要使用NSNumber包装 */
@"gay" : @YES
};
User *user = [User mj_objectWithKeyValues:dict_user];
NSLog(@"%@ %u %@",user.name,user.sex,user.icon); }
二 JSON字符串转模型
- (void) stringToModel {
NSString *jsonStr = @"{\"name\":\"Jack\", \"icon\":\"lufy.png\", \"age\":20}";
User *user = [User mj_objectWithKeyValues:jsonStr];
NSLog(@"%@ %u %@",user.name,user.age,user.icon);
}
三 复杂的字典转模型
@interface Status : NSObject @property (nonatomic,copy) NSString *text;
@property (nonatomic,strong) User *user;
@property (nonatomic,strong) Status *retweetedStatus; @end - (void)complexDicToModel {
NSDictionary *dict_m8m = @{
@"text" : @"Agree!Nice weather!",
@"user" : @{
@"name" : @"Jack",
@"icon" : @"lufy.png"
},
@"retweetedStatus" : @{
@"text" : @"Nice weather!",
@"user" : @{
@"name" : @"Rose",
@"icon" : @"nami.png"
}
}
}; Status *status = [Status mj_objectWithKeyValues:dict_m8m];
NSString *text = status.text;
NSString *name = status.user.name;
NSString *icon = status.user.icon;
NSLog(@"mj-----text=%@, name=%@, icon=%@", text, name, icon);
NSString *text2 = status.retweetedStatus.text;
NSString *name2 = status.retweetedStatus.user.name;
NSString *icon2 = status.retweetedStatus.user.icon;
NSLog(@"mj-----text2=%@, name2=%@, icon2=%@", text2, name2, icon2); }
四 模型中有个数组属性,数组里面又装着其他属性
@interface Status : NSObject @property (nonatomic,copy) NSString *text;
@property (nonatomic,strong) User *user;
@property (nonatomic,strong) Status *retweetedStatus; @end @interface ADModel : NSObject @property (nonatomic,copy) NSString *image; @property (nonatomic,copy) NSString *url; @end @interface resultModel : NSObject @property (nonatomic,strong) NSMutableArray *statuses;
@property (nonatomic,strong) NSMutableArray *ads;
@property (nonatomic,strong) NSNumber *totalNumber;
@property (nonatomic,assign) long long previousCursor;
@property (nonatomic,assign) long long nextCursor; @end @implementation resultModel + (NSDictionary *)mj_objectClassInArray {
return @{@"statuses" : @"Status", @"ads":@"ADModel"};
} @end - (void)complexDicContentArrToModel {
// 1.定义一个字典
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" : @"",
@"previousCursor" : @"",
@"nextCursor" : @""
};
resultModel *model = [resultModel mj_objectWithKeyValues:dict];
NSLog(@"resultModel %lld ",model.nextCursor,model.previousCursor);
// 4.打印statuses数组中的模型属性
for (Status *status in model.statuses) {
NSString *text = status.text;
NSString *name = status.user.name;
NSString *icon = status.user.icon;
MJExtensionLog(@"text=%@, name=%@, icon=%@", text, name, icon);
} // 5.打印ads数组中的模型属性
for (ADModel *ad in model.ads) {
MJExtensionLog(@"image=%@, url=%@", ad.image, ad.url);
} }
五 简单的字典转模型 (key替换 比如ID和id,支持多级映射)
@interface Bag : NSObject @property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) CGFloat price; @end @interface Student : NSObject @property (copy, nonatomic) NSString *ID;
@property (copy, nonatomic) NSString *otherName;
@property (copy, nonatomic) NSString *nowName;
@property (copy, nonatomic) NSString *oldName;
@property (copy, nonatomic) NSString *nameChangedTime;
@property (copy, nonatomic) NSString *desc;
@property (strong, nonatomic) Bag *bag; @end @implementation Student + (NSDictionary *)mj_replacedKeyFromPropertyName {
return @{@"ID":@"id",@"desc":@"desciption",@"oldName":@"name.oldName",@"nowName":@"name.newName",@"nameChangedTime":@"name.info[1].nameChangedTime",@"bag":@"other.bag"};
} @end - (void)keyValues2object4 {
// 1.定义一个字典
NSDictionary *dict = @{
@"id" : @"",
@"desciption" : @"好孩子",
@"name" : @{
@"newName" : @"lufy",
@"oldName" : @"kitty",
@"info" : @[
@"test-data",
@{@"nameChangedTime" : @"2013-08-07"}
]
},
@"other" : @{
@"bag" : @{
@"name" : @"小书包",
@"price" : @100.7
}
}
}; // 2.将字典转为MJStudent模型
Student *stu = [Student mj_objectWithKeyValues:dict]; // 3.打印MJStudent模型的属性
MJExtensionLog(@"ID=%@, desc=%@, oldName=%@, nowName=%@, nameChangedTime=%@", stu.ID, stu.desc, stu.oldName, stu.nowName, stu.nameChangedTime);
MJExtensionLog(@"bagName=%@, bagPrice=%f", stu.bag.name, stu.bag.price);
}
六 将一个字典数组转成模型数组
- (void)arrayToModel {
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);
}
}
七 将一个模型转成字典
- (void)modelToDict {
User *user = [[User alloc] init];
user.name = @"jack";
user.icon = @"lufy.png";
NSDictionary *userDic = user.mj_keyValues;
NSLog(@"%@",userDic);
}
八 将一个模型数组转成字典数组
//模型数组 转 字典数组
- (void)modelArrayToDicArray {
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 mj_keyValuesArrayWithObjectArray:userArray]; }
九 NSCoding 示例
#import <Foundation/Foundation.h>
#import "MJExtension.h" @interface LFCar : NSObject @property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) double price; @end #import "LFCar.h" @implementation LFCar MJExtensionCodingImplementation @end - (void)viewDidLoad {
[super viewDidLoad]; LFCar *car = [[LFCar alloc] init];
car.name = @"red bag";
car.price = 200.8; NSString *file = [NSTemporaryDirectory() stringByAppendingPathComponent:@"bag.data"];
//归档
[NSKeyedArchiver archiveRootObject:car toFile:file];
//解档
LFCar *decodedCar = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
NSLog(@"%@ %f",decodedCar.name,decodedCar.price);
}
这就是MJExtension 的基本用法 还有一些其他的不常用的用法 参考这里http://blog.csdn.net/jeikerxiao/article/details/51590222
OC中第三方库MJExtension的使用的更多相关文章
- Python中第三方库Requests库的高级用法详解
Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...
- 在swift调用OC的第三方库
https://www.jianshu.com/p/4799ac1d7dce 2017.06.02 23:55* 字数 275 阅读 1619评论 0喜欢 3 环境:xcode 8.3.2 系统: M ...
- 用CMake设置Visual Studio工程中第三方库
较大的工程文件中一般会调用动态库或者静态库,如果这些库文件是当前工程包含的项目,CMake会自动识别并添加Debug和Release编译时需要的库文件路径和文件名,可以使用命令: Target_Lin ...
- Python中第三方库的安装
网上的帖子挺多的,教你如何安装,安装第三方工具库的方法总共分为三类:Dos系统下pip命令:安装包下载安装:IDE集成环境下安装(Pycharm,Spyder……) http://www.jiansh ...
- 关于python中第三方库安装方法和问题解决
一.安装方法 方法一: 1.管理员身份启动命令行(运行--->cmd) 2.pip install 库的绝对路径和库的详细名称 :或者运用cd命令跳转到下载好的库所在的位置然后pip insta ...
- yii中第三方库
yii中存在一些路径别名:ext:表示包含了所有第三方扩展的目录 参考:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.namespac ...
- ios中第三方库归结
1:uiscrollview 折叠 展开中不包含tablecell. 展开列表效果 Collapse Click () https://github.com/bennyguitar/Collapse ...
- Swift中混编OC第三方库
现在Swift的第三方库还比较少,有时候需要使用OC的第三方库,其实也是很容易的. 我们使用如下步骤: 1.新建的Swift项目,第一次创建OC文件时会询问是否生成 桥接头,选择是的话会生成一个桥 ...
- swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者
Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...
随机推荐
- 通过脚本发送zabbix邮件报警
zabbix原生的报警媒介类型中,邮件报警是我们常用的方式.当我们在CentOS6上面安装zabbix3.0并配置邮件报警的时候,在邮件配置正确的前提下,不管触发器如何触发,邮件总是发送不出去,但是在 ...
- 【转】Linux 中清空或删除大文件内容的五种方法(truncate 命令清空文件)
原文: http://www.jb51.net/article/100462.htm truncate -s 0 access.log -------------------------------- ...
- JAVA泛化及为什么需要泛化
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 比如,有一种类型为List,此时该List可以是任意类型的列表,如Integer,String等等. 如果把List类型改为List ...
- Web项目中用mybatis配置多个数据库
需要在项目中配置多个数据库(比如一个mysql,一个oracle)的时候,可按照如下方式配置 首先是第一个数据库的配置 <bean name="transactionManager&q ...
- 三分钟教你学Git(十三) - 二分查找
比方说你收到了错误报告,然后你知道前几天明明是好的.可是这几天有好多新的commit被部署了.那么我们怎么迅速的找到第一个引入Bug的commit呢? 我们能够使用git bisect,git利用二分 ...
- ios多线程操作(四)—— GCD核心概念
GCD全称Grand Central Dispatch.可译为"大派发中枢调度器",以纯C语言写成,提供了很多很强大的函数.GCD是苹果公司为多核的并行运算提出的解决方式,它能够自 ...
- jquery load方式浏览器断点调试
jquery load的方式引入的,如果需要在浏览器中断点调试,需要在代码中使用debugger进行断点
- vue created 生命周期
在实例创建完成后被立即调用.在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调.然而,挂载阶段还没开始,$el属性目前不可见. ...
- STL学习笔记(仿函数)
仿函数(Functors) 仿函数(functor),就是使一个类的使用看上去象一个函数.其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了. 例如我们定义一个 ...
- js 将内容复制到剪贴板
js 将内容复制到剪贴板 CreationTime--2018年7月1日15点06分 Author:Marydon function copyToClipboard(txt) { if(windo ...