iOS字典转模型

一、获取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;

}



猜你喜欢

转载自blog.csdn.net/qq_37191821/article/details/80932234