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


 

 

 

 

你可能感兴趣的:(gson)