提供一個model轉字典的方法

因項目中需要,實現(xiàn)了一個模型轉換字典的方法,支持遞歸處理。方便快速將模型轉換為字典或將屬性轉化為json,與javascript或后臺通信的需求。
.h文件:

#import <Foundation/Foundation.h>

@interface NSObject (ModelToDictionary)
/**
 *  模型轉字典
 *
 *  @return 字典
 */
- (NSDictionary *)dictionaryFromModel;

/**
 *  帶model的數(shù)組或字典轉字典
 *
 *  @param object 帶model的數(shù)組或字典轉
 *
 *  @return 字典
 */
- (id)idFromObject:(nonnull id)object;

@end

.m文件:

#import "NSObject+ModelToDictionary.h"
#import <objc/runtime.h>

@implementation NSObject (ModelToDictionary)

- (NSDictionary *)dictionaryFromModel
{
    unsigned int count = 0;
    
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:count];
    
    for (int i = 0; i < count; i++) {
        NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
        id value = [self valueForKey:key];
        
        //only add it to dictionary if it is not nil
        if (key && value) {
            if ([value isKindOfClass:[NSString class]]
                || [value isKindOfClass:[NSNumber class]]) {
                // 普通類型的直接變成字典的值
                [dict setObject:value forKey:key];
            }
            else if ([value isKindOfClass:[NSArray class]]
                     || [value isKindOfClass:[NSDictionary class]]) {
                // 數(shù)組類型或字典類型
                [dict setObject:[self idFromObject:value] forKey:key];
            }
            else {
                // 如果model里有其他自定義模型,則遞歸將其轉換為字典
                [dict setObject:[value dictionaryFromModel] forKey:key];
            }
        } else if (key && value == nil) {
            // 如果當前對象該值為空,設為nil。在字典中直接加nil會拋異常,需要加NSNull對象
            [dict setObject:[NSNull null] forKey:key];
        }
    }
    
    free(properties);
    return dict;
}

- (id)idFromObject:(nonnull id)object
{
    if ([object isKindOfClass:[NSArray class]]) {
        if (object != nil && [object count] > 0) {
            NSMutableArray *array = [NSMutableArray array];
            for (id obj in object) {
                // 基本類型直接添加
                if ([obj isKindOfClass:[NSString class]]
                    || [obj isKindOfClass:[NSNumber class]]) {
                    [array addObject:obj];
                }
                // 字典或數(shù)組需遞歸處理
                else if ([obj isKindOfClass:[NSDictionary class]]
                         || [obj isKindOfClass:[NSArray class]]) {
                    [array addObject:[self idFromObject:obj]];
                }
                // model轉化為字典
                else {
                    [array addObject:[obj dictionaryFromModel]];
                }
            }
            return array;
        }
        else {
            return object ? : [NSNull null];
        }
    }
    else if ([object isKindOfClass:[NSDictionary class]]) {
        if (object && [[object allKeys] count] > 0) {
            NSMutableDictionary *dic = [NSMutableDictionary dictionary];
            for (NSString *key in [object allKeys]) {
                // 基本類型直接添加
                if ([object[key] isKindOfClass:[NSNumber class]]
                    || [object[key] isKindOfClass:[NSString class]]) {
                    [dic setObject:object[key] forKey:key];
                }
                // 字典或數(shù)組需遞歸處理
                else if ([object[key] isKindOfClass:[NSArray class]]
                         || [object[key] isKindOfClass:[NSDictionary class]]) {
                    [dic setObject:[self idFromObject:object[key]] forKey:key];
                }
                // model轉化為字典
                else {
                    [dic setObject:[object[key] dictionaryFromModel] forKey:key];
                }
            }
            return dic;
        }
        else {
            return object ? : [NSNull null];
        }
    }
    
    return [NSNull null];
}

@end

調用:
[someModel dictionaryFromModel];

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,720評論 25 709
  • 或許我們每個人都想擁有穿越時空的能力,因為總會有一些令人遺憾或追悔莫及的事情,而這些事情在“現(xiàn)在”這個時間維度上已...
    Dawn_lym閱讀 922評論 2 1
  • 有時候人計較的太多,心會很累,不計較,人們會說你傻,其實人這一輩子傻一點,憨一點挺好,俗話說得好,得于失就看你怎么...
    承運閱讀 229評論 0 0
  • 我深深地感覺到自己已經(jīng)變了。我不知道這是一個好的變化,還是一個壞的變化。感覺自己越來越偏,現(xiàn)實化,不開心就是不開心...
    黑白2閱讀 265評論 0 0

友情鏈接更多精彩內(nèi)容