赞
踩
1.简单的字典 --> 模型
- 核心代码
mj_objectWithKeyValues:
typedef enum { SexMale, SexFemale } Sex; @interface User : NSObject @property (copy, nonatomic) NSString *name;/* 姓名 */ @property (copy, nonatomic) NSString *icon;/* 头像 */ @property (assign, nonatomic) unsigned int age;/* 年龄 */ @property (copy, nonatomic) NSString *height;/* 身高 */ @property (strong, nonatomic) NSNumber *money;/* 资产 */ @property (assign, nonatomic) Sex sex;/* 性别 */ @property (assign, nonatomic, getter=isGay) BOOL gay;/* 是否是同性恋 */ @end //简单的字典 NSDictionary *dict_user = @{ @"name" : @"Jack", @"icon" : @"lufy.png", @"age" : @20, @"height" : @"1.55", @"money" : @100.9, @"sex" : @(SexFemale),/* 枚举需要使用NSNumber包装 */ @"gay" : @YES }; User *user = [User mj_objectWithKeyValues:dict_user]; NSLog(@"MJ---%@----%@---%u---%@---%@---%u----%d",user.name,user.icon,user.age,user.height,user.money,user.sex,user.gay); //打印结果 //2016-07-04 11:06:59.746 PPDemos[2432:73824] MJ---Jack----lufy.png---20---1.55---100.9---1----1
2. JSON字符串 --> 模型
- 核心代码
mj_objectWithKeyValues:
// 定义一个JSON字符串 NSString *jsonStr = @"{\"name\":\"Jack\", \"icon\":\"lufy.png\", \"age\":20}"; User *user = [User mj_objectWithKeyValues:jsonStr]; NSLog(@"MJ---%@----%@---%u",user.name,user.icon,user.age); //打印结果 //2016-07-04 11:16:04.655 PPDemos[2563:78561] MJ---Jack----lufy.png---20
3. 复杂的字典 --> 模型 (模型里面包含了模型)
- 核心代码
mj_objectWithKeyValues:
//复杂的字典[模型中有个数组属性,数组里面又要装着其他模型的字典] NSDictionary *dict_m8m = @{ @"text" : @"Agree!Nice weather!", @"user" : @{ @"name" : @"Jack", @"icon" : @"lufy.png" }, @"retweetedStatus" : @{ @"text" : @"Nice weather!", @"user" : @{ @"name" : @"Rose", @"icon" : @"nami.png" } } };
#import <Foundation/Foundation.h> @class User; @class Status; //Status模型 @interface Status : NSObject @property (copy, nonatomic) NSString *text; @property (strong, nonatomic) User *user;/* 其他模型类型 */ @property (strong, nonatomic) Status *retweetedStatus;/* 自我模型类型 */ @end // //字典转模型,模型里面含有模型 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); // //打印结果 //2016-07-04 11:45:39.675 PPDemos[2781:87089] mj-----text=Agree!Nice weather!, name=Jack, icon=lufy.png //2016-07-04 11:45:39.675 PPDemos[2781:87089] mj-----text2=Nice weather!, name2=Rose, icon2=nami.png
4.模型中有个数组属性,数组里面又要装着其它模型
- 核心代码
mj_objectWithKeyValues:
和mj_objectClassInArray
@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
#import "StatusResult.h" #import "MJExtension.h" @implementation StatusResult /* 数组中存储模型数据,需要说明数组中存储的模型数据类型 */ +(NSDictionary *)mj_objectClassInArray { return @{ @"statuses" : @"Status", @"ads" : @"Ad" }; } @end在VC里实现以下来解析数据
//模型中有个数组属性,数组里面又要装着其他模型 NSDictionry *dict_m8a = @{ @"statuses" : @[ @{ @"text" : @"Nice weather!", @"user" : @{ @"name" : @"Rose", @"icon" : @"nami.png" } }, @{ @"text" : @"Go camping tomorrow!", @"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 mj_setupObjectClassInArray:^NSDictionary *{ return @{ @"statuses" : @"Status", // @"statuses" : [Status class], @"ads" : @"Ad" // @"ads" : [Ad class] }; }]; // Equals: StatusResult.m implements +mj_objectClassInArray method. */ //以上方法在VC里写,如果多个地方解析该model,就要写多次,最好在model的.m文件写! //字典转模型,支持模型的数组属性里面又装着模型 StatusResult *result = [StatusResult mj_objectWithKeyValues:dict_m8a]; //打印博主信息 for (Status *status in result.statuses) { NSString *text = status.text; NSString *name = status.user.name; NSString *icon = status.user.icon; NSLog(@"mj---text=%@, name=%@, icon=%@", text, name, icon); } //打印广告 for (Ad *ad in result.ads) { NSLog(@"mj---image=%@, url=%@", ad.image, ad.url); } //打印结果 //2016-07-04 13:47:58.994 PPDemos[3353:113055] mj---text=Nice weather!, name=Rose, icon=nami.png //2016-07-04 13:47:58.995 PPDemos[3353:113055] mj---text=Go camping tomorrow!, name=Jack, icon=lufy.png //2016-07-04 13:47:58.995 PPDemos[3353:113055] mj---image=ad01.png, url=http://www.ad01.com //2016-07-04 13:47:58.995 PPDemos[3353:113055] mj---image=ad02.png, url=http://www.ad02.com
5.模型中的属性名和字典中的key不相同(或者需要多级映射)
- 核心代码
mj_objectWithKeyValues:
和mj_replacedKeyFromPropertyName
//多级映射,用点语法设置
@interface Bag : NSObject @property (copy, nonatomic) NSString *name; @property (assign, nonatomic) double price; @end
#import <Foundation/Foundation.h> @class Bag; @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 +(NSDictionary *)mj_replacedKeyFromPropertyName { // 实现这个方法的目的:告诉MJExtension框架模型中的属性名对应着字典的哪个key return @{ @"ID" : @"id", @"desc" : @"desciption", @"oldName" : @"name.oldName", @"nowName" : @"name.newName", @"nameChangedTime" : @"name.info[1].nameChangedTime", @"bag" : @"other.bag" }; } @end
NSDictionry *dict_nokey = @{ @"id" : @"20", @"desciption" : @"kids", @"name" : @{ @"newName" : @"lufy", @"oldName" : @"kitty", @"info" : @[ @"test-data", @{ @"nameChangedTime" : @"2013-08" } ] }, @"other" : @{ @"bag" : @{ @"name" : @"a red bag", @"price" : @100.7 } } }; // // // How to map // [Student mj_setupReplacedKeyFromPropertyName:^NSDictionary *{ // return @{ // @"ID" : @"id", // @"desc" : @"desciption", // @"oldName" : @"name.oldName", // @"nowName" : @"name.newName", // @"nameChangedTime" : @"name.info[1].nameChangedTime", // @"bag" : @"other.bag" // }; // }]; // // Equals: Student.m implements +mj_replacedKeyFromPropertyName method. //字典转模型,支持多级映射 Student *stu = [Student mj_objectWithKeyValues:dict_nokey]; //打印 NSLog(@"ID=%@, desc=%@, oldName=%@, nowName=%@, nameChangedTime=%@", stu.ID, stu.desc, stu.oldName, stu.nowName, stu.nameChangedTime); NSLog(@"bagName=%@, bagPrice=%f", stu.bag.name, stu.bag.price); //2016-07-04 14:20:28.082 PPDemos[3602:126004] ID=20, desc=kids, oldName=kitty, nowName=lufy, nameChangedTime=2013-08 //2016-07-04 14:20:28.082 PPDemos[3602:126004] bagName=a red bag, bagPrice=100.700000
6.将一个字典数组转成模型数组
- 核心代码
mj_objectArrayWithKeyValuesArray
NSArray *dictArray = @[ @{ @"name" : @"Jack", @"icon" : @"lufy.png" }, @{ @"name" : @"Rose", @"icon" : @"nami.png" } ]; //字典数组转模型数组,使用的是mj_objectArrayWithKeyValuesArray:方法 NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray]; //打印 for (User *user in userArray) { NSLog(@"name=%@, icon=%@", user.name, user.icon); } // name=Jack, icon=lufy.png // name=Rose, icon=nami.png
7. 将一个模型转成字典
- 核心代码
mj_keyValues
User *user = [[User alloc] init]; user.name = @"Jack"; user.icon = @"lufy.png"; // Status *status = [[Status alloc] init]; status.user = user; status.text = @"Nice mood!"; // //模型转字典,使用的是mj_keyValues属性 NSDictionary *statusDict = status.mj_keyValues; NSLog(@"%@", statusDict); /* { text = "Nice mood!"; user = { icon = "lufy.png"; name = Jack; }; } */
8. 将一个模型数组转成字典数组
- 核心代码
mj_keyValuesArrayWithObjectArray
//创建模型数组 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]; //模型数组转字典数组,使用的是mj_keyValuesArrayWithObjectArray:方法 NSArray *dictArray = [User mj_keyValuesArrayWithObjectArray:userArray]; NSLog(@"%@", dictArray); /* ( { icon = "lufy.png"; name = Jack; }, { icon = "nami.png"; name = Rose; } ) */
- 参考NSObject+MJKeyValue.h
- 参考NSObject+MJCoding.h
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。