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. ...
随机推荐
- Angular 学习笔记——自定义指令之间的交互
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_字符串
一般声明字符串都会加一个长度的限制,比如A:STRING(80);至于真实的字符串长度不要超过这个限制即可 在测试中,我演示了两个字符串的方法,CONCAT字符串拼接和REPLACE字符串替换.拼 ...
- 设置快速的debian源的方法:
1)设置临时源 vi /etc/apt/sources.list #添加以下一行到文件最后 deb http://http.us.debian.org/debian stable main 2)更新软 ...
- Laravel利用pusher推送消息
一.注册pusher 1.注册https://pusher.com/ 2.获取key,密匙,app_id等 二.配置pusher 1.安装pusher composer require pusher/ ...
- TCO'10 Wildcard Round 1000pt
题目大意: 给定一个N*M的棋盘,棋子可以攻击其左右距离不超过K的棋子.问有多少种放法使得棋盘上的棋子不能互相攻击. N,M,K都在1到1000000000的范围内,结果对100003取模. 官方题解 ...
- react-native 常见问题 及 解决方案
一.报错 Warning:Navigator:isMounted is deprecated. Instead, make sure to clean up subscriptions and pen ...
- 定制一个类似地址选择器的view
代码地址如下:http://www.demodashi.com/demo/12832.html 前言: 这几天也是闲来无事,看看有什么和Scroller相关的控件需要巩固下,原因很简单,前几天看到相关 ...
- Servlet的API(一)
Servlet的API有很多,这里只谈谈两个Servlet对象:ServletConfig对象和ServletContext对象. 1. ServletConfig对象 在Servlet的配置文件中, ...
- VM虚拟机内ubuntu无法连接到网络
VM虚拟机内ubuntu无法连接到网络 解决:编辑网络,将网路都删除掉.又一次加入网络桥接和NAT链接. .又一次连接就可以,查看一下ip地址. 方法2: 虚拟机中新装ubuntu 编辑虚拟网络,先恢 ...
- 使用spring-boot-admin对spring-boot服务进行监控(转自牛逼的人物)
尊重原创:http://www.cnblogs.com/ityouknow/p/8440455.html 上一篇文章<springboot(十九):使用Spring Boot Actuator监 ...