一、获取Model所有属性:
#pragma mark - 获取所有属性
-(NSArray<NSString*>*)getSelfPropertyNamesWithObject:(id)object{
u_int count;
objc_property_t * properties = class_copyPropertyList([object class], &count);
NSMutableArray * tempArray = [NSMutableArray new];
for (int i=0; i<count; i++) {
objc_property_t property = properties[i];
[tempArray addObject:[[NSString alloc]initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]];
}
free(properties);
return tempArray;
}
二、获取Model属性类型:
#pragma mark-------获取属性的类型 非对象返回null如NSInteger、CGFloat、float、double、BOOL
-(NSString *)getObject:(id)object PropertyType:(NSString *)property {
//获取对象的类型objc_getClass("UserModel")
objc_property_t p = class_getProperty([object class], property.UTF8String);
// 2.成员类型
NSString *attrs = @(property_getAttributes(p));
NSUInteger dotLoc = [attrs rangeOfString:@","].location;
NSString *code = nil;
NSUInteger loc = 3;
if (dotLoc == NSNotFound) { // 没有,
code = [attrs substringFromIndex:loc];
} else {
code = [attrs substringWithRange:NSMakeRange(loc, dotLoc - loc-1)];
}
return code;
}
三、将字典转为模型:
+(id)objectWithJson:(NSDictionary *)json{
id object = [[self alloc] init];
NSArray * names = [object getSelfPropertyNamesWithObject:object];
for(NSString * name in names){
if([json objectForKey:name] != nil){
if([[json objectForKey:name] isKindOfClass:[NSString class]]){
[object setValue:[json objectForKey:name] forKey:name];
}else if([[json objectForKey:name] isKindOfClass:[NSNumber class]]){
NSString * string = [NSString stringWithFormat:@"%@",[json objectForKey:name]];
[object setValue:string forKey:name];
}else if([[json objectForKey:name] isKindOfClass:[NSDictionary class]]){
id objectValue = [object handleJsonDictionary:[json objectForKey:name] WithKeyName:name];
[object setValue:objectValue forKey:name];
}else if([[json objectForKey:name] isKindOfClass:[NSArray class]]){
NSArray * objectValue = [object handldJsonArray:[json objectForKey:name] WithKeyName:name];
[object setValue:objectValue forKey:name];
}else{
[object setValue:[json objectForKey:name] forKey:name];
}
}else{
[object setValue:[object getDefaultValueWithName:name] forKey:name];
}
}
return object;
}
-(id)handleJsonDictionary:(NSDictionary *)dic WithKeyName:(NSString*)name{
id objectValue = dic;
NSDictionary * tempDic = [self objectClassInJson];
for(NSString * key in [tempDic allKeys]){
if([key isEqualToString:name]){
Class class = NSClassFromString([tempDic objectForKey:key]);
objectValue = [class objectWithJson:dic];
break;
}
}
return objectValue;
}
-(NSArray*)handldJsonArray:(NSArray *)array WithKeyName:(NSString *)name{
NSMutableArray * objectArray = [NSMutableArray new];
if([[array firstObject] isKindOfClass:[NSString class]]){
objectArray = [NSMutableArray arrayWithArray:array];
}else if([[array firstObject] isKindOfClass:[NSNumber class]]){
objectArray = [NSMutableArray arrayWithArray:array];
}else if([[array firstObject] isKindOfClass:[NSDictionary class]]){
for(NSDictionary * obj in array){
[objectArray addObject:[self handleJsonDictionary:obj WithKeyName:name]];
}
}else if([[array firstObject] isKindOfClass:[NSArray class]]){
for(NSArray * objs in array){
[objectArray addObject:[self handldJsonArray:objs WithKeyName:name]];
}
}else if([[array firstObject] isKindOfClass:[NSObject class]]){
for(NSObject * obj in array){
[objectArray addObject:obj];
}
}
return objectArray;
}
四、当字典里属性值为nil时,初始化属性值:
#pragma mark - 给属性默认值
-(id)getDefaultValueWithName:(NSString *)name{
id defaultValue ;
if([self getObject:self PropertyType:name]){
if([[self getObject:self PropertyType:name] isEqualToString:@"NSNumber"]){
defaultValue = @(0);
}else{
Class class = NSClassFromString([self getObject:self PropertyType:name]);
defaultValue = [class objectWithJson:[NSDictionary dictionary]];
}
}else{
defaultValue = [@(0) stringValue];
}
return defaultValue;
}
五、模型转字符串输出:
#pragma mark - 打印输出对象
-(NSString *)objectLogToString{
NSMutableString * string = [NSMutableString string];
[string appendString:[NSString stringWithFormat:@"%@{\n",self]];
NSArray * names = [self getSelfPropertyNamesWithObject:self];
for(NSString * name in names){
[string appendString:name];
[string appendString:@" ->> "];
if([self getObject:self PropertyType:name] && [self valueForKey:name]){
Class class = NSClassFromString([self getObject:self PropertyType:name]);
if([[class new] isKindOfClass:[NSString class]]){
[string appendString:[self valueForKey:name]];
}else if([[class new] isKindOfClass:[NSNumber class]]){
[string appendString:[NSString stringWithFormat:@"%@",[self valueForKey:name]]];
}else if([[class new] isKindOfClass:[NSDictionary class]]){
[string appendString:[self logToStringFromDictionary:[self valueForKey:name]]];
}else if([[class new] isKindOfClass:[NSArray class]]){
NSString * arrayString = [self logToArrayFromArray:[self valueForKey:name]];
[string appendString:arrayString];
}else if([[class new] isKindOfClass:[NSObject class]]){
[string appendString:[[self valueForKey:name] objectLogToString]];
}
[string appendString:@";\n"];
}else if([self valueForKey:name]){
[string appendString:[NSString stringWithFormat:@"%@",[self valueForKey:name]]];
[string appendString:@";\n"];
}else{
[string appendString:@";\n"];
}
}
[string appendString:@"}"];
return string;
}
-(NSString *)logToStringFromDictionary:(NSDictionary*)json{
NSMutableDictionary * resultJson = [NSMutableDictionary new];
for(NSString * key in [json allKeys]){
if([[json objectForKey:key] isKindOfClass:[NSNumber class]]){
[resultJson setObject:[NSString stringWithFormat:@"%@",[json objectForKey:key]] forKey:key];
}else if([[json objectForKey:key] isKindOfClass:[NSString class]]){
[resultJson setObject:[json objectForKey:key] forKey:key];
}else if([[json objectForKey:key] isKindOfClass:[NSDictionary class]]){
[resultJson setObject:[self logToStringFromDictionary:[json objectForKey:key]] forKey:key];
}else if([[json objectForKey:key] isKindOfClass:[NSArray class]]){
[resultJson setObject:[self logToArrayFromArray:[json objectForKey:key]] forKey:key];
}else if([[json objectForKey:key] isKindOfClass:[NSObject class]]){
[resultJson setObject:[[json objectForKey:key] objectLogToString] forKey:key];
}else{
[resultJson setObject:[json objectForKey:key] forKey:key];
}
}
return [self toStringWithDictionary:resultJson];
}
#pragma mark - 数组内对象转成字符串
-(NSString*)logToArrayFromArray:(NSArray*)array{
NSMutableArray * tempArray = [NSMutableArray new];
if([[array firstObject] isKindOfClass:[NSString class]]){
tempArray = [NSMutableArray arrayWithArray:array];
}else if([[array firstObject] isKindOfClass:[NSNumber class]]){
for(NSNumber * number in array){
[tempArray addObject:[NSString stringWithFormat:@"%@",number]];
}
}else if([[array firstObject] isKindOfClass:[NSDictionary class]]){
for(NSDictionary * obj in array){
[tempArray addObject:[self logToStringFromDictionary:obj]];
}
}else if([[array firstObject] isKindOfClass:[NSArray class]]){
for(NSArray * objs in array){
[tempArray addObject:[self logToArrayFromArray:objs]];
}
}else if([[array firstObject] isKindOfClass:[NSObject class]]){
for(id obj in array){
[tempArray addObject:[obj objectLogToString]];
}
}
return [self toStringWithArray:tempArray];
}
-(NSString *)toStringWithArray:(NSArray*)array{
NSMutableString * string = [NSMutableString string];
[string appendString:@"[\n"];
[string appendString:[array componentsJoinedByString:@";\n"]];
[string appendString:@" \n]"];
return string;
}
-(NSString *)toStringWithDictionary:(NSDictionary*)json{
NSMutableString * string = [NSMutableString string];
[string appendString:@"{\n"];
for(NSString * key in [json allKeys]){
[string appendString:key];
[string appendString:@" -> "];
[string appendString:[json objectForKey:key]];
}
[string appendString:@"\n}"];
return string;
}