ios runtime 实现json转模型

runtime 字典转模型,主要是利用runtime的class_copyIvarList方法来获取到类中的所有的成员变量,字典转模型的情况有以下几种情况:

1、json对象中包含对象,这种情况下,如果model定义的属性名和json中对象的参数一致,则不需要做多余的处理,否则要对model中定义的属性名进行指定,已和json数据中的参数一致

2、json对象中包含数组,数组里面包含其他对象;这种情况下,要指定数组里面的对象对应的model模型,类似于YYModel里面的modelContainerPropertyGenericClass方法

例如:

图一
图二

例如图一和图二,图一中定义的birthday和图二中的birth是表达一个意思,但是名称不一致,这时就需要将birthday指定成birth

图一定义了一个User属性对象user,这个user和图二的user是一致的,所以即使是对象,也不需要做其他操作

其余注意的地方会在具体的代码中实现出来

//    创建当前类的实例变量

    idobjc = [[selfalloc]init];

    ididself =self;

    unsignedintcount;

//    获取类中所有的属性变量

    Ivar* ivarList =class_copyIvarList(self, &count);

//    遍历所有的属性变量

    for(inti =0; i < count; i ++) {

//        根据下标获取成员变量

        Ivarivar = ivarList[i];

//        获取成员变量名称

        NSString * name = [NSString stringWithUTF8String:ivar_getName(ivar)];

//        获取当前的成员变量的类型

        NSString * ivarType = [NSString  stringWithUTF8String:ivar_getTypeEncoding(ivar)];

//        对类型type进行处理

        ivarType = [ivarTyp estringByReplacingOccurrencesOfString:@"\"" withString:@""];

        ivarType = [ivarType stringByReplacingOccurrencesOfString:@"@" withString:@""];

//        处理获取到的变量名——>对获取的name进行截取(name第一位为_)

        NSString * key = [name substringFromIndex:1];

//        当字典中的字段和定义属性名不一致的时候,需要对key进行转换,以取得字典中的数据

        ididkey = [idself modelCustomPropertyMapper][key];

        if(idkey ==nil) {

            idkey = key;

        }

//        根据key值获取字典中对应的value

        id value = dict[idkey];

if(value) {

            [objc setValue:value forKey:key];

        }}

上述代码中最主要的几点就是runtime里面的几个主要的方法来实现:

1、class_copyIvarList方法,这个方法有两个参数,一个是Class参数,传入的是想获取的model类,另外一个为unsigned int类型,会返回当前类所有的属性变量的个数

2、ivar_getName 这个是获取属性变量名的名称,例如_user

3、ivar_getTypeEncoding 这个方法是获取当前属性名的类型,返回的是:@"\User\"

针对json中的字段和定义的属性不一致的时候,这时就需要指定属性名为json中的字段

图三

modelCustomPropertyMapper方法的实现是返回一个字典,字典类似于@{@"birthday":@"birth"},其中birthday是自己定义的属性,birth是json中对应的字段,指定birthday为birth后,则可以在json中获取到对应的数据

二、下面是针对model对象中包含model对象

//        判断当前的value是不是字典

        if([value isKindOfClass:[NSDictionary class]] && ![ivarType







hasPrefix:@"NS"]) {

            //        获取type的类型

            ClassmethodClass =NSClassFromString(ivarType);

//            如果typeClass存在,则

            if(methodClass) {

                value = [methodClass modelWithDict:value];

            }

        }

上述代码会获取到当前model对应的类型,如果当前这个model来存在,则进行赋值

三、model对象中包含数组,这个时候就需要指定数组中对应model模型,例如:Person对象中,定义一个users数组,users数组里面包含的对象类型是User这个时候需要在方法arrayContainModelClass中指定:

图四

这个处理好之后,就可以处理这种情况了:

//        判断当前的value 是不是数组

        if ([value isKindOfClass:[NSArray class]]) {

//            获取到数组value的type

            NSString*type = [idselfarrayContainModelClass][key];

//            生成模型

            ClassmethodClass =NSClassFromString(type);

            NSMutableArray * mulary= [NSMutableArray array];

//            遍历字典数组,生成模型数组

            for(NSDictionary* dic in value) {

//                字典转模型

                idmodel = [methodClass modelWithDict:dic];

                [mulary addObject:model];

            }

            value = mulary;

        }

上述代码理解起来不难,主要是遍历数组,然后保存到value中,赋值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,392评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,103评论 1 32
  • 引导 对于从事 iOS 开发人员来说,所有的人都会答出「 Runtime 是运行时 」,什么情况下用 Runtim...
    Winny_园球阅读 4,209评论 3 75
  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,721评论 7 64
  • 人间仙境何处寻, 尘都雾霾在清晨。 咫尺天涯无所见, 还道伊人是路人。
    xueshuai阅读 166评论 3 3