美文网首页
ios runtime 实现json转模型

ios runtime 实现json转模型

作者: 莪的世界木有如果 | 来源:发表于2018-07-30 15:03 被阅读144次

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中,赋值

相关文章

网友评论

      本文标题:ios runtime 实现json转模型

      本文链接:https://www.haomeiwen.com/subject/thdfvftx.html