在開發(fā)中驳概,對于處理網(wǎng)絡(luò)請求中獲取的數(shù)據(jù)(即把請求到的json或字典轉(zhuǎn)換成方便使用的數(shù)據(jù)模型)是我們在開發(fā)中必不可少的操作照棋。諸如強大的第三方MJExtension、JSONModel或者YYModel是我們所熟知的框架,因為它們使用起來簡單方便,簡單到有時候一句代碼就可以實現(xiàn)我們所需要的字典和模型之間的轉(zhuǎn)換阐肤。但我們不能光會用,也要明白它們實現(xiàn)的原理讲坎。今天我介紹下基本原理 相信大家理解原理基本也可以自己寫一個孕惜。
首先我們需要了解runtime獲取成員變量:
unsigned int count;//成員變量的數(shù)量
//獲取成員變量元素的數(shù)組
Ivar *ivars = class_copyIvarList([LsPerson class], &count);
for (int i = 0; i < count; i++) {
// 取出i位置的成員變量
Ivar ivar = ivars[I];
NSLog(@" %s", ivar_getName(ivar));
//獲取成員變量的名稱
ivar_getName
}
開干直接上碼
@interface NSObject (Json)
/**
字典轉(zhuǎn)模型
@param json jsondict
@param dict 這里面是需要改變名字的字典 key是轉(zhuǎn)換后的名稱 value是轉(zhuǎn)換后的
@return ——
*/
+ (instancetype)ls_objectWithJson:(NSDictionary *)json proDict:(NSDictionary *)dict;
#import "NSObject+Json.h"
#import <objc/runtime.h>
@implementation NSObject (Json)
+ (instancetype)ls_objectWithJson:(NSDictionary *)json proDict:(NSDictionary *)dict
{
id obj = [[self alloc] init];
unsigned int count;
//獲取我所有成員變量的信息
Ivar *ivars = class_copyIvarList(self, &count);
for (int i = 0; i < count; i++) {
// 取出i位置的成員變量
Ivar ivar = ivars[I];
NSMutableString *name = [NSMutableString stringWithUTF8String:ivar_getName(ivar)];
//去掉下劃線
[name deleteCharactersInRange:NSMakeRange(0, 1)];
// 設(shè)值
id value = json[name];
NSArray *keyArray = dict.allKeys;
//判斷有沒有要改變名字的然后改變
for (NSString *keyStr in keyArray) {
if ([name isEqualToString:keyStr]) {
NSString *valueStr = dict[keyStr];
value = json[valueStr];
}
}
//這里最好加一個 @try 因為value為空時會崩潰
@try {
[obj setValue:value forKey:name];
} @catch (NSException *exception) {
} @finally {
}
}
free(ivars);//釋放
return obj;
}
搞懂了上面然后就是是數(shù)組字典轉(zhuǎn)數(shù)組模型
/**
數(shù)組字典轉(zhuǎn)數(shù)組模型
@param array 數(shù)組字典
@param dict 這里面是需要改變名字的字典 key是轉(zhuǎn)換后的名稱 value是轉(zhuǎn)換后的
@return 數(shù)組
*/
+(NSArray *)ls_arrayWithJson:(NSArray *)array proDict:(NSDictionary *)dict;
/**
數(shù)組字典轉(zhuǎn)數(shù)組模型
@param array 數(shù)組字典
@param dict 這里面是需要改變名字的字典 key是轉(zhuǎn)換后的名稱 value是轉(zhuǎn)換后的
@return 數(shù)組
*/
+(NSArray *)ls_arrayWithJson:(NSArray *)array proDict:(NSDictionary *)dict{
NSMutableArray *arrayDataSoure = [[NSMutableArray alloc]init];
for (NSDictionary *jsonDict in array) {
id obj = [[self alloc]init];
unsigned int count;
//獲取我所有成員變量的信息
Ivar *ivars = class_copyIvarList(self, &count);
for (int i = 0; i<count; i++) {
Ivar ivar = ivars[I];
// 取出i位置的成員變量
NSMutableString *name = [NSMutableString stringWithUTF8String:ivar_getName(ivar)];
[name deleteCharactersInRange:NSMakeRange(0, 1)];
id value = jsonDict[name]; // 設(shè)值
NSArray *keyArray = dict.allKeys;
//判斷有沒有要改變名字的然后改變
for (NSString *keyStr in keyArray) {
if ([name isEqualToString:keyStr]) {
NSString *valueStr = dict[keyStr];
value = jsonDict[valueStr];
}
}
//這里最好加一個 @try 因為value為空時會崩潰
@try {
[obj setValue:value forKey:name];
} @catch (NSException *exception) {
} @finally {
}
}
[arrayDataSoure addObject:obj];
}
return arrayDataSoure;
}
然后在外部調(diào)用
// 字典轉(zhuǎn)模型
NSDictionary *json = @{
@"id" : @30,
@"age" : @40,
@"weight" : @70,
@"name" : @"Jack",
@"height" : @"170cm"
};
LSperson *person = [LSperson ls_objectWithJson:json proDict:@{@"ID":@"id",@"heightStr":@"height"}];
NSArray *dataSoure = [LSperson ls_arrayWithJson:@[json,json,json] proDict:@{@"ID":@"id"}];
打印看看:
WeChatcecf975bdd99ce75aa29f8bd64a89883.png
對吧這樣就轉(zhuǎn)換過來了。
其實原理很簡單晨炕,只是很多復(fù)雜的我們要考慮很多細(xì)節(jié)衫画。只要知道原理了細(xì)節(jié)就慢慢摸索吧