// // HYBJSONModel.h // Json2ModelDemo // // Created by huangyibiao on 14-9-15. // Copyright (c) 2014年 Home. All rights reserved. // #import <Foundation/Foundation.h> /*! * @brief JSON转换成Model,或者把Model转换成JSON * @author huangyibiao */ @interface HYBJSONModel : NSObject /*! * @brief 把对象(Model)转换成字典 * @param model 模型对象 * @return 返回字典 */ + (NSDictionary *)dictionaryWithModel:(id)model; /*! * @brief 获取Model的所有属性名称 * @param model 模型对象 * @return 返回模型中的所有属性值 */ + (NSArray *)propertiesInModel:(id)model; /*! * @brief 把字典转换成模型,模型类名为className * @param dict 字典对象 * @param className 类名 * @return 返回数据模型对象 */ + (id)modelWithDict:(NSDictionary *)dict className:(NSString *)className; @end
// // HYBJSONModel.m // Json2ModelDemo // // Created by huangyibiao on 14-9-15. // Copyright (c) 2014年 Home. All rights reserved. // #import "HYBJSONModel.h" #import <objc/runtime.h> typedef NS_ENUM(NSInteger, HYBJSONModelDataType) { kHYBJSONModelDataTypeObject = 0, kHYBJSONModelDataTypeBOOL = 1, kHYBJSONModelDataTypeInteger = 2, kHYBJSONModelDataTypeFloat = 3, kHYBJSONModelDataTypeDouble = 4, kHYBJSONModelDataTypeLong = 5, }; @implementation HYBJSONModel /*! * @brief 把对象(Model)转换成字典 * @param model 模型对象 * @return 返回字典 */ + (NSDictionary *)dictionaryWithModel:(id)model { if (model == nil) { return nil; } NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; // 获取类名/根据类名获取类对象 NSString *className = NSStringFromClass([model class]); id classObject = objc_getClass([className UTF8String]); // 获取所有属性 unsigned int count = 0; objc_property_t *properties = class_copyPropertyList(classObject, &count); // 遍历所有属性 for (int i = 0; i < count; i++) { // 取得属性 objc_property_t property = properties[i]; // 取得属性名 NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; // 取得属性值 id propertyValue = nil; id valueObject = [model valueForKey:propertyName]; if ([valueObject isKindOfClass:[NSDictionary class]]) { propertyValue = [NSDictionary dictionaryWithDictionary:valueObject]; } else if ([valueObject isKindOfClass:[NSArray class]]) { propertyValue = [NSArray arrayWithArray:valueObject]; } else { propertyValue = [NSString stringWithFormat:@"%@", [model valueForKey:propertyName]]; } [dict setObject:propertyValue forKey:propertyName]; } return [dict copy]; } /*! * @brief 获取Model的所有属性名称 * @param model 模型对象 * @return 返回模型中的所有属性值 */ + (NSArray *)propertiesInModel:(id)model { if (model == nil) { return nil; } NSMutableArray *propertiesArray = [[NSMutableArray alloc] init]; NSString *className = NSStringFromClass([model class]); id classObject = objc_getClass([className UTF8String]); unsigned int count = 0; objc_property_t *properties = class_copyPropertyList(classObject, &count); for (int i = 0; i < count; i++) { // 取得属性名 objc_property_t property = properties[i]; NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; [propertiesArray addObject:propertyName]; } return [propertiesArray copy]; } /*! * @brief 把字典转换成模型,模型类名为className * @param dict 字典对象 * @param className 类名 * @return 返回数据模型对象 */ + (id)modelWithDict:(NSDictionary *)dict className:(NSString *)className { if (dict == nil || className == nil || className.length == 0) { return nil; } id model = [[NSClassFromString(className) alloc]init]; // 取得类对象 id classObject = objc_getClass([className UTF8String]); unsigned int count = 0; objc_property_t *properties = class_copyPropertyList(classObject, &count); Ivar *ivars = class_copyIvarList(classObject, nil); for (int i = 0; i < count; i ++) { // 取得成员名 NSString *memberName = [NSString stringWithUTF8String:ivar_getName(ivars[i])]; const char *type = ivar_getTypeEncoding(ivars[i]); NSString *dataType = [NSString stringWithCString:type encoding:NSUTF8StringEncoding]; NSLog(@"Data %@ type: %@",memberName,dataType); HYBJSONModelDataType rtype = kHYBJSONModelDataTypeObject; if ([dataType hasPrefix:@"c"]) { rtype = kHYBJSONModelDataTypeBOOL;// BOOL } else if ([dataType hasPrefix:@"i"]) { rtype = kHYBJSONModelDataTypeInteger;// int } else if ([dataType hasPrefix:@"f"]) { rtype = kHYBJSONModelDataTypeFloat;// float } else if ([dataType hasPrefix:@"d"]) { rtype = kHYBJSONModelDataTypeDouble; // double } else if ([dataType hasPrefix:@"l"]) { rtype = kHYBJSONModelDataTypeLong;// long } for (int j = 0; j < count; j++) { objc_property_t property = properties[j]; NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; NSRange range = [memberName rangeOfString:propertyName]; if (range.location == NSNotFound) { continue; } else { id propertyValue = [dict objectForKey:propertyName]; switch (rtype) { case kHYBJSONModelDataTypeBOOL: { BOOL temp = [[NSString stringWithFormat:@"%@", propertyValue] boolValue]; propertyValue = [NSNumber numberWithBool:temp]; } break; case kHYBJSONModelDataTypeInteger: { int temp = [[NSString stringWithFormat:@"%@", propertyValue] intValue]; propertyValue = [NSNumber numberWithInt:temp]; } break; case kHYBJSONModelDataTypeFloat: { float temp = [[NSString stringWithFormat:@"%@", propertyValue] floatValue]; propertyValue = [NSNumber numberWithFloat:temp]; } break; case kHYBJSONModelDataTypeDouble: { double temp = [[NSString stringWithFormat:@"%@", propertyValue] doubleValue]; propertyValue = [NSNumber numberWithDouble:temp]; } break; case kHYBJSONModelDataTypeLong: { long long temp = [[NSString stringWithFormat:@"%@",propertyValue] longLongValue]; propertyValue = [NSNumber numberWithLongLong:temp]; } break; default: break; } [model setValue:propertyValue forKey:memberName]; break; } } } return model; } @end