iOS开发——对象与字典互相转换

功能

通过自定义Model基类,实现:

1、将json字典转换成对象,无需考虑属性名称和字典键(key)的名称的关系,即可以自定义映射关系。也支持字典中自定义对象的赋值。

2、一行代码将对象转换为json字典。

使用

让自定义的Model类继承自CYZBaseModel即可。然后根据需要选择重写或者调用的方法。

字典转对象:

1、如果字典中的键的名称与对象的属性名称一样,则不需要重新任何方法,或者在attributeMapDictionary中返回nil即可。

2、如果字典中有任一键的名称与对象属性不一样,则需要自己建立映射字典,即在attributeMapDictionary中返回自己创建的一个字典类对象,该字典中,以属性名作为key,以“映射字典”(即传入字典)的键作为value。听起来可能比较绕,详情一看代码便知。

3、如果有自定义对象,则在setAttributeDictionary:中从字典中取出小字典并用它创建对象,然后赋值即可。

4、无论上述哪种情况,在创建你的自定义对象时都使用initWithDict:方法,传入dictionary便可以自动转成对象。

对象转字典:

调用方法dictionaryRepresentation即可

实现思路

主要用到的知识点就是反射,或者说objc的runtime知识。对象转字典,要获取到对象中的所有属性,然后把属性名和属性值存入字典即可。字典转对象,就是先根据自己定义的映射字典(map dictionary)将自己的属性名转换为待转换字典的key的名字,然后根据自己属性的名字获取setter方法,将待转换字典中取出来的值作为setter的参数调用就行了。

代码

对象转字典:

- (NSDictionary *)dictionaryRepresentation {
    unsigned int count = 0;
    //get a list of all properties of this class
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:count];

    NSDictionary *keyValueMap = [self attributeMapDictionary];

    for (int i = 0; i < count; i++) {
        NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
        id value = [self valueForKey:key];
        NSLog(@"key = %@, value = %@, value class = %@, changed Key = %@", key, value, NSStringFromClass([value class]), [keyValueMap objectForKey:key]);
        key = [keyValueMap objectForKey:key];
        //only add it to dictionary if it is not nil
        if (key && value) {
            [dict setObject:value forKey:key];
        }
    }

    free(properties);
    return dict;
}

字典转对象:

- (id)initWithDict:(NSDictionary *)aDict
{
    self = [super init];

    if (self) {
        //建立映射关系
        [self setAttributesDictionary:aDict];
    }

    return self;
}

- (NSDictionary *)attributeMapDictionary
{
    //子类需要重写的方法
    //NSAssert(NO, "You should override this method in Your Custom Class");
    return nil;
}

- (void)setAttributesDictionary:(NSDictionary *)aDict
{
    //获得映射字典
    NSDictionary *mapDictionary = [self attributeMapDictionary];

    //如果子类没有重写attributeMapDictionary方法,则使用默认映射字典
    if (mapDictionary == nil) {
        NSMutableDictionary *tempDict = [NSMutableDictionary dictionaryWithCapacity:aDict.count];
        for (NSString *key in aDict) {
            [tempDict setObject:key forKey:key];
        }
        mapDictionary = tempDict;
    }

    //遍历映射字典
    NSEnumerator *keyEnumerator = [mapDictionary keyEnumerator];
    id attributeName = nil;
    while ((attributeName = [keyEnumerator nextObject])) {
        //获得属性的setter
        SEL setter = [self _getSetterWithAttributeName:attributeName];
        if ([self respondsToSelector:setter]) {
            //获得映射字典的值,也就是传入字典的键
            NSString *aDictKey = [mapDictionary objectForKey:attributeName];
            //获得传入字典的键对应的值,也就是要赋给属性的值
            id aDictValue = [aDict objectForKey:aDictKey];

            //为属性赋值
            [self performSelectorOnMainThread:setter withObject:aDictValue waitUntilDone:[NSThread isMainThread]];
        }
    }
}

- (SEL)_getSetterWithAttributeName:(NSString *)attributeName
{
    NSString *firstAlpha = [[attributeName substringToIndex:1] uppercaseString];
    NSString *otherAlpha = [attributeName substringFromIndex:1];
    NSString *setterMethodName = [NSString stringWithFormat:@"set%@%@:", firstAlpha, otherAlpha];
    return NSSelectorFromString(setterMethodName);
}

下载

项目地址:https://github.com/YiZhuoChen/CYZBaseModel

时间: 2024-11-03 05:55:17

iOS开发——对象与字典互相转换的相关文章

iOS开发UI篇—字典转模型

iOS开发UI篇—字典转模型 一.能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 // // LFViewController.m // 03-应用管理 // // Created by apple on 14-5-22. // Copyright (c) 2014年 heima. All rights reserved. // #import "LFViewController.h" @interface LFViewController () @proper

文顶顶 iOS开发UI篇—字典转模型

iOS开发UI篇—字典转模型 一.能完成功能的“问题代码” 1.从plist中加载的数据 2.实现的代码 1 // 2 // LFViewController.m 3 // 03-应用管理 4 // 5 // Created by apple on 14-5-22. 6 // Copyright (c) 2014年 heima. All rights reserved. 7 // 8 9 #import "LFViewController.h" 10 11 @interface LFV

iOS开发UI基础—字典转模型(部分内容转载他人)

iOS开发UI基础-字典转模型 开发中,通常使用第三方框架可以很快的实现通过字典转模型,通过plist创建模型,将字典的键值对转成模型属性,将模型转成字典,通过模型数组来创建一个字典数组,通过字典数组来创建一个模型数组等等. 一.能完成功能的"问题代码" 1.从plist中加载的数据 2.实现的代码 1 // 2 // LFViewController.m 3 // 03-应用管理 4 // 5 // Created by apple on 14-5-22. 6 // Copyrigh

iOS开发-16进制颜色转换

项目中经常会用到颜色转换,有的是通过十六进制转成数字转颜色,想简单的点直接通过字符串转一下,简单扩展了一下分类UIColor,代码如下: +(UIColor *)colorWithHex:(NSString *)hexColor{ return [self colorWithHex:hexColor alpha:1.0f]; } //http://www.cnblogs.com/xiaofeixiang iOS技术交流:228407086 +(UIColor *)colorWithHex:(NS

iOS开发————对象之间通信之代理协议

一.代理实现对象间通信: 确定谁是代理对象,谁是被代理对象. 事件在哪里发生?谁就是被代理对象 事件在哪里响应?谁就是代理对象 需求: 举例:保姆照顾小孩,当小孩脏了时给她清洁,当小孩不开心时陪玩. 被代理类 Child 定义代理属性(id),并且此代理属性要遵守协议 事件发生时,要调用代理属性的协议方法来响应这个事件. 代理类 Nanny 要遵守协议 实现协议方法,协议方法中的内容就是对事件做出的响应. 代理设计模式解决是程序架构上的问题,使程序架构更合理,更具扩展性,降低类与类之前的耦合性.

iOS开发————对象间通信之block

一.block的概念: 别称:代码段,块,闭包,是苹果公司添加到OC语言中的. 作用:在程序运行的过程中保存一段代码,并且这段代码可以进行传递. 应用:用于对象间的通信. 二.block的语法: 和函数指针的语法相似 要设定block的返回值和参数个数及类型. (1)定义: 无参无返回值的block变量:void (^myBlock)(void) 有参数有返回值的block变量 int (^sumBlock)(int, int); (2)赋值: myBlock = ^{ //block中的代码

iOS开发中NSDate时间戳的转换--

NSTimeInterval time =(NSTimeInterval )[model.day floatValue]; NSDate *date = [NSDate dateWithTimeIntervalSince1970:time]; //转化为字符串 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormatter setDateFormat:@"yyyy/MM/dd hh:mm"];

ios 开发之 各种数据类型之间转换 (持续补充)

1.图片转base64串及反转回图片 UIImage图片转成base64字符串: 1 UIImage *_originImage = [UIImage imageNamed:@"full_playlist_hl.png"]; 2 NSData *_data = UIImageJPEGRepresentation(_image, 1.0f);3 NSString *_encodedImageStr = [_data base64Encoding]; 4 NSLog(@"===E

文顶顶iOS开发博客链接整理及部分项目源代码下载

文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课和跟着文顶顶的博客做项目之后,最快只需要2个月时间,就基本可以独立完成iOS App的开发工作.有经验的开发者也可以在该博客中寻找代码片段进行学习借鉴,必有所收获. 在此也向@文顶顶 表示严重感谢! 由于文顶顶博客博文繁多,每次找文章需要频繁的翻页,