iGson

头文件

 

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import "NSString+Utils.h"

@interface iGson : NSObject

// 获取所有的property
- (NSMutableArray *)getPropertyNames;

// 获取成员属性及属性的类型等信息的列表
- (NSMutableArray *)getPropertyAttrs;

// 获取非ReadOnly的所有property
- (NSMutableArray *)getNotReadOnlyPropertyNames;

// 获取一个该类的实例需要多少字节的内存开销
+ (size_t)getInstanceMemoryCost;

// 使用JSONKit做JSON解析
// 用于JSON解析的辅助方法,方便对象赋值
+ (id)objFromDict:(NSDictionary *)dict;
+ (id)objFromJson:(NSString *)json;

// 转换成json字符串
- (NSString *)objToJson;
- (NSDictionary *)ojbToDict;

// 用于各个子类测试json解析
- (void)testJsonParse;

@end

 

实现文件

 

#import "iGson.h"
#import "JSONKit.h"


@interface NSString (Utils)
- (BOOL)hasSubString:(NSString *)string;
@end

@implementation NSString (Utils)
- (BOOL)hasSubString:(NSString *)string
{
    NSRange range = [self rangeOfString:string];
    if(range.location == NSNotFound)
        return FALSE;
    return TRUE;
}
@end

@interface iGson ()
+ (BOOL)isPropertyReadOnly:(objc_property_t)property;
@end


@implementation iGson

+ (BOOL)isPropertyReadOnly:(objc_property_t)property
{
    NSString *propertyAttrString =  [NSString stringWithCString:property_getAttributes(property)
                                                       encoding:NSUTF8StringEncoding];
    
    
    if([propertyAttrString hasSubString: @",R,"]){
        return YES;
    }
    
    return FALSE;
}


- (NSMutableArray *)getPropertyAttrs
{
    Class cls = [self class];
    NSMutableArray *propertyAttrsList = [[NSMutableArray alloc] init];
    
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];{
        
        unsigned int outCount = 0, i = 0;
        objc_property_t *properties = class_copyPropertyList(cls, &outCount);
        
        for( i = 0; i < outCount; i++){
            objc_property_t property = properties[i];
            //printf("%s\n" ,property_getAttributes(property));
            
            NSString *propertyAttrString =  [NSString stringWithCString:property_getAttributes(property)
                                                               encoding:NSUTF8StringEncoding];
            //NSLog(@"propertyAttr: %@", propertyAttrString);
            
            // 字符串非空,则加入属性列表
            if(!(propertyAttrString == nil ||
                 propertyAttrString.length == 0 ||
                 [propertyAttrString isEqualToString:@""]))
            {
                [propertyAttrsList addObject:propertyAttrString];
            }
        }
        
        [pool drain];
    }
    return [propertyAttrsList autorelease];
}


- (NSMutableArray *)getPropertyNames
{
    Class cls = [self class];
    NSMutableArray *propertyList = [[NSMutableArray alloc] init];
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];{
        
        unsigned int outCount = 0, i = 0;
        objc_property_t *properties = class_copyPropertyList(cls, &outCount);
        
        for( i = 0; i < outCount; i++){
            
            objc_property_t property = properties[i];
            //printf("%s\n", property_getName(property));
            
            
            
            NSString *propertyString =  [NSString stringWithCString:property_getName(property)
                                                           encoding:NSUTF8StringEncoding];
            //NSLog(@"property: %@", propertyString);
            // 字符串非空,则加入属性列表
            if(!(propertyString == nil ||
                 propertyString.length == 0 ||
                 [propertyString isEqualToString:@""]))
            {
                [propertyList addObject:propertyString];
            }
        }
        
        [pool drain];
    }
    return [propertyList autorelease];
}

- (NSMutableArray *)getNotReadOnlyPropertyNames
{
    Class cls = [self class];
    NSMutableArray *propertyList = [[NSMutableArray alloc] init];
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];{
        
        unsigned int outCount = 0, i = 0;
        objc_property_t *properties = class_copyPropertyList(cls, &outCount);
        
        for( i = 0; i < outCount; i++){
            
            objc_property_t property = properties[i];
            //printf("%s\n", property_getName(property));
            
            if([Model isPropertyReadOnly:property]) continue;
            
            NSString *propertyString =  [NSString stringWithCString:property_getName(property)
                                                           encoding:NSUTF8StringEncoding];
            //NSLog(@"property: %@", propertyString);
            // 字符串非空,则加入属性列表
            if(!(propertyString == nil ||
                 propertyString.length == 0 ||
                 [propertyString isEqualToString:@""]))
            {
                [propertyList addObject:propertyString];
            }
        }
        
        [pool drain];
    }
    return [propertyList autorelease];
    
}

+ (size_t)getInstanceMemoryCost
{
    return class_getInstanceSize([self class]);
}


+ (id)objFromDict:(NSDictionary *)dict
{
    id obj = [[[self class] alloc] init];
    
    NSMutableArray *properties = [obj getNotReadOnlyPropertyNames];
    for(NSString *property in properties){
        id objValue = [dict objectForKey:property];
        if([objValue isKindOfClass:[NSDictionary class]]){
            objValue = [[self class] objFromDict:objValue];
        }else if ([objValue isKindOfClass:[NSArray class]]){
            for(id itemObj in ((NSArray *)objValue)){
                itemObj = [[self class] objFromDict:itemObj]; // 这句是否合理,需要测试下
            }
        }
        //判断非空再赋值
        if(objValue && (![objValue isKindOfClass:[NSNull class]])){
            [obj setValue:objValue forKey:property];
        }
        
    }
    
#if __has_feature(objc_arc)
    return obj;
#else
    return [obj autorelease];
#endif
    
}

+ (id)objFromJson:(NSString *)json
{
    id dict = [json objectFromJSONString];
    return [[self class] objFromDict:dict];
}

- (NSDictionary *)objToDict
{
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    NSMutableArray *properties = [self getNotReadOnlyPropertyNames];
    for(NSString *property in properties){
        id obj = [self valueForKey:property];
        [dict setValue:obj forKey:property];
    }
    
    return dict;
}


- (NSString *)objToJson
{
    NSString *json = nil;
    json = [[self objToDict] JSONString];
    return json;
}

- (NSString *)description
{
    NSMutableString *s = [NSMutableString stringWithCapacity:0];
    
    [s appendFormat:@"\nClass: %@{\n", NSStringFromClass([self class])];
    NSArray *arr = [self getNotReadOnlyPropertyNames];
    for(id o in arr){
        [s appendFormat:@"%@: %@\n", o, [self valueForKey:o]];
    }
    [s appendFormat:@"}\n"];
    return s;
}


- (void)setNilValueForKey:(NSString *)key
{
    // 暂时不做处理
}

- (void)testJsonParse
{
    // 子类重载实现
}

@end


 

 

 

 

posted on 2014-01-03 11:19  我的小人生  阅读(176)  评论(0编辑  收藏  举报