提供一個model轉(zhuǎn)字典的方法

因項目中需要泣特,實現(xiàn)了一個模型轉(zhuǎn)換字典的方法,支持遞歸處理戚嗅。方便快速將模型轉(zhuǎn)換為字典或?qū)傩赞D(zhuǎn)化為json,與javascript或后臺通信的需求。
.h文件:

#import <Foundation/Foundation.h>

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

/**
 *  帶model的數(shù)組或字典轉(zhuǎn)字典
 *
 *  @param object 帶model的數(shù)組或字典轉(zhuǎn)
 *
 *  @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里有其他自定義模型涂邀,則遞歸將其轉(zhuǎn)換為字典
                [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轉(zhuǎn)化為字典
                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轉(zhuǎn)化為字典
                else {
                    [dic setObject:[object[key] dictionaryFromModel] forKey:key];
                }
            }
            return dic;
        }
        else {
            return object ? : [NSNull null];
        }
    }
    
    return [NSNull null];
}

@end

調(diào)用:
[someModel dictionaryFromModel];

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末清钥,一起剝皮案震驚了整個濱河市洪规,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌循捺,老刑警劉巖斩例,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異从橘,居然都是意外死亡念赶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門恰力,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叉谜,“玉大人,你說我怎么就攤上這事踩萎⊥>郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵香府,是天一觀的道長董栽。 經(jīng)常有香客問我,道長企孩,這世上最難降的妖魔是什么锭碳? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮勿璃,結(jié)果婚禮上擒抛,老公的妹妹穿的比我還像新娘。我一直安慰自己补疑,他們只是感情好歧沪,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莲组,像睡著了一般诊胞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胁编,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天厢钧,我揣著相機與錄音,去河邊找鬼嬉橙。 笑死早直,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的市框。 我是一名探鬼主播霞扬,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枫振!你這毒婦竟也來了喻圃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粪滤,失蹤者是張志新(化名)和其女友劉穎斧拍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杖小,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡肆汹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了予权。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昂勉。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扫腺,靈堂內(nèi)的尸體忽然破棺而出岗照,到底是詐尸還是另有隱情,我是刑警寧澤笆环,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布攒至,位于F島的核電站,受9級特大地震影響躁劣,放射性物質(zhì)發(fā)生泄漏嗓袱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一习绢、第九天 我趴在偏房一處隱蔽的房頂上張望渠抹。 院中可真熱鬧,春花似錦闪萄、人聲如沸梧却。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽放航。三九已至,卻和暖如春圆裕,著一層夾襖步出監(jiān)牢的瞬間广鳍,已是汗流浹背荆几。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赊时,地道東北人吨铸。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像祖秒,于是被迫代替她去往敵國和親诞吱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

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