对象转字典 iOS

最近在开发SDK,我开放给客户model类设置信息后,对象转字典,POST给后台。

思路:通过Runtime访问属性列表,快速转换成字典。

FRObjectToDictionary.h类

#import <Foundation/Foundation.h>

 

@interface FRObjectToDictionary : NSObject

+ (NSDictionary*)getObjectData:(id)obj;

@end

 

 

FRObjectToDictionary.m类

 

 

#import "FRObjectToDictionary.h"

#import <objc/runtime.h>

@implementation FRObjectToDictionary

 

+ (NSDictionary*)getObjectData:(id)obj

{

    NSMutableDictionary *dic = [NSMutableDictionary dictionary];

    unsigned int propsCount;

    objc_property_t *props = class_copyPropertyList([obj class], &propsCount);//获得属性列表

    for(int i = 0;i < propsCount; i++)

    {

        objc_property_t prop = props[i];

        

        NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];//获得属性的名称

        id value = [obj valueForKey:propName];//kvc读值

        if(value == nil)

        {

            value = [NSNull null];

        }

        else

        {

            value = [self getObjectInternal:value];//自定义处理数组,字典,其他类

        }

        [dic setObject:value forKey:propName];

    }

    return dic;

}

 

 

+ (id)getObjectInternal:(id)obj

{

    if([obj isKindOfClass:[NSString class]]

       || [obj isKindOfClass:[NSNumber class]]

       || [obj isKindOfClass:[NSNull class]])

    {

        return obj;

    }

    

    if([obj isKindOfClass:[NSArray class]])

    {

        NSArray *objarr = obj;

        NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count];

        for(int i = 0;i < objarr.count; i++)

        {

            [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i];

        }

        return arr;

    }

    

    if([obj isKindOfClass:[NSDictionary class]])

    {

        NSDictionary *objdic = obj;

        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]];

        for(NSString *key in objdic.allKeys)

        {

            [dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];

        }

        return dic;

    }

    return [self getObjectData:obj];

}

 

 

@end

 

 

调用时:

[FRObjectToDictionary getObjectData:aModel]

原文地址:https://www.cnblogs.com/huangzs/p/7743731.html