IOS Dictionary和Model相互转换

//
//  HYBJSONModel.h
//  Json2ModelDemo
//
//  Created by huangyibiao on 14-9-15.
//  Copyright (c) 2014年 Home. All rights reserved.
//

#import <Foundation/Foundation.h>

/*!
 * @brief JSON转换成Model,或者把Model转换成JSON
 * @author huangyibiao
 */
@interface HYBJSONModel : NSObject

/*!
 * @brief 把对象(Model)转换成字典
 * @param model 模型对象
 * @return 返回字典
 */
+ (NSDictionary *)dictionaryWithModel:(id)model;

/*!
 * @brief 获取Model的所有属性名称
 * @param model 模型对象
 * @return 返回模型中的所有属性值
 */
+ (NSArray *)propertiesInModel:(id)model;

/*!
 * @brief 把字典转换成模型,模型类名为className
 * @param dict 字典对象
 * @param className 类名
 * @return 返回数据模型对象
 */
+ (id)modelWithDict:(NSDictionary *)dict className:(NSString *)className;

@end
//
//  HYBJSONModel.m
//  Json2ModelDemo
//
//  Created by huangyibiao on 14-9-15.
//  Copyright (c) 2014年 Home. All rights reserved.
//

#import "HYBJSONModel.h"
#import <objc/runtime.h>

typedef NS_ENUM(NSInteger, HYBJSONModelDataType) {
    kHYBJSONModelDataTypeObject    = 0,
    kHYBJSONModelDataTypeBOOL      = 1,
    kHYBJSONModelDataTypeInteger   = 2,
    kHYBJSONModelDataTypeFloat     = 3,
    kHYBJSONModelDataTypeDouble    = 4,
    kHYBJSONModelDataTypeLong      = 5,
};

@implementation HYBJSONModel

/*!
 * @brief 把对象(Model)转换成字典
 * @param model 模型对象
 * @return 返回字典
 */
+ (NSDictionary *)dictionaryWithModel:(id)model {
    if (model == nil) {
        return nil;
    }

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

    // 获取类名/根据类名获取类对象
    NSString *className = NSStringFromClass([model class]);
    id classObject = objc_getClass([className UTF8String]);

    // 获取所有属性
    unsigned int count = 0;
    objc_property_t *properties = class_copyPropertyList(classObject, &count);

    // 遍历所有属性
    for (int i = 0; i < count; i++) {
        // 取得属性
        objc_property_t property = properties[i];
        // 取得属性名
        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)
                                                          encoding:NSUTF8StringEncoding];
        // 取得属性值
        id propertyValue = nil;
        id valueObject = [model valueForKey:propertyName];

        if ([valueObject isKindOfClass:[NSDictionary class]]) {
            propertyValue = [NSDictionary dictionaryWithDictionary:valueObject];
        } else if ([valueObject isKindOfClass:[NSArray class]]) {
            propertyValue = [NSArray arrayWithArray:valueObject];
        } else {
            propertyValue = [NSString stringWithFormat:@"%@", [model valueForKey:propertyName]];
        }

        [dict setObject:propertyValue forKey:propertyName];
    }
    return [dict copy];
}

/*!
 * @brief 获取Model的所有属性名称
 * @param model 模型对象
 * @return 返回模型中的所有属性值
 */
+ (NSArray *)propertiesInModel:(id)model {
    if (model == nil) {
        return nil;
    }

    NSMutableArray *propertiesArray = [[NSMutableArray alloc] init];

    NSString *className = NSStringFromClass([model class]);
    id classObject = objc_getClass([className UTF8String]);
    unsigned int count = 0;
    objc_property_t *properties = class_copyPropertyList(classObject, &count);

    for (int i = 0; i < count; i++) {
        // 取得属性名
        objc_property_t property = properties[i];
        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)
                                                          encoding:NSUTF8StringEncoding];
        [propertiesArray addObject:propertyName];
    }

    return [propertiesArray copy];
}

/*!
 * @brief 把字典转换成模型,模型类名为className
 * @param dict 字典对象
 * @param className 类名
 * @return 返回数据模型对象
 */
+ (id)modelWithDict:(NSDictionary *)dict className:(NSString *)className {
    if (dict == nil || className == nil || className.length == 0) {
        return nil;
    }

    id model = [[NSClassFromString(className) alloc]init];

    // 取得类对象
    id classObject = objc_getClass([className UTF8String]);

    unsigned int count = 0;
    objc_property_t *properties = class_copyPropertyList(classObject, &count);
    Ivar *ivars = class_copyIvarList(classObject, nil);

    for (int i = 0; i < count; i ++) {
        // 取得成员名
        NSString *memberName = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
        const char *type = ivar_getTypeEncoding(ivars[i]);
        NSString *dataType =  [NSString stringWithCString:type encoding:NSUTF8StringEncoding];

        NSLog(@"Data %@ type: %@",memberName,dataType);

        HYBJSONModelDataType rtype = kHYBJSONModelDataTypeObject;
        if ([dataType hasPrefix:@"c"]) {
            rtype = kHYBJSONModelDataTypeBOOL;// BOOL
        } else if ([dataType hasPrefix:@"i"]) {
            rtype = kHYBJSONModelDataTypeInteger;// int
        } else if ([dataType hasPrefix:@"f"]) {
            rtype = kHYBJSONModelDataTypeFloat;// float
        } else if ([dataType hasPrefix:@"d"]) {
            rtype = kHYBJSONModelDataTypeDouble; // double
        } else if ([dataType hasPrefix:@"l"])  {
            rtype = kHYBJSONModelDataTypeLong;// long
        }

        for (int j = 0; j < count; j++) {
            objc_property_t property = properties[j];
            NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)
                                                              encoding:NSUTF8StringEncoding];
            NSRange range = [memberName rangeOfString:propertyName];

            if (range.location == NSNotFound) {
                continue;
            } else {
                id propertyValue = [dict objectForKey:propertyName];

                switch (rtype) {
                    case kHYBJSONModelDataTypeBOOL: {
                        BOOL temp = [[NSString stringWithFormat:@"%@", propertyValue] boolValue];
                        propertyValue = [NSNumber numberWithBool:temp];
                    }
                        break;
                    case kHYBJSONModelDataTypeInteger: {
                        int temp = [[NSString stringWithFormat:@"%@", propertyValue] intValue];
                        propertyValue = [NSNumber numberWithInt:temp];
                    }
                        break;
                    case kHYBJSONModelDataTypeFloat: {
                        float temp = [[NSString stringWithFormat:@"%@", propertyValue] floatValue];
                        propertyValue = [NSNumber numberWithFloat:temp];
                    }
                        break;
                    case kHYBJSONModelDataTypeDouble: {
                        double temp = [[NSString stringWithFormat:@"%@", propertyValue] doubleValue];
                        propertyValue = [NSNumber numberWithDouble:temp];
                    }
                        break;
                    case kHYBJSONModelDataTypeLong: {
                        long long temp = [[NSString stringWithFormat:@"%@",propertyValue] longLongValue];
                        propertyValue = [NSNumber numberWithLongLong:temp];
                    }
                        break;

                    default:
                        break;
                }

                [model setValue:propertyValue forKey:memberName];
                break;
            }
        }
    }
    return model;
}

@end
时间: 2024-10-29 14:18:18

IOS Dictionary和Model相互转换的相关文章

ios中常用数据类型相互转换

ios中常用数据类型相互转换 //1. NSMutableArray和NSArray互转 // NSArray转为NSMutableArray NSMutableArray *arrM = [arr mutableCopy]; //方法1 NSMutableArray *arrM = [NSMutableArray arrayWithArray:arr]; //方法2 // NSMutableArray转为NSArray NSArray *arr = [arrM copy]; //方法1 NSA

【AutoMapper官方文档】DTO与Domin Model相互转换(上)

前言 Flattening-复杂到简单 Projection-简单到复杂 Configuration Validation-配置验证 Lists and Array-集合和数组 Nested mappings-嵌套映射 后记 上一篇<[道德经]漫谈实体.对象.DTO及AutoMapper的使用 >,因为内容写的有点跑偏,关于AutoMapper的使用最后只是简单写了下,很明显这种简单的使用方式不能满足项目中复杂的需要,网上找了下AutoMapper相关文档,但差不多都是像我一样简单的概述下,看

【AutoMapper官方文档】DTO与Domin Model相互转换(中)

写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) 持续更新中... 本篇目录: Custom Type Converters-自定义类型转换器 Custom Value Resolvers-自定义值解析器 Null Substitution-空值替换 Containers-IoC容器 后记 随着AutoMapper的学习深入,发现AutoMapper在对

iOS之JSON Model模型

本文转自:http://blog.csdn.net/smking/article/details/40432287 下面讲一下JSONModel的使用方法. @inteface MyModel : JSONModel 1. 使用JSONModel时,不需要额外去检查所要的服务器属性是否有返回.JSONModel的initWithDictionary方法会自动去进行检查并处理. 2. 有效性检查,如果指定的服务器返回的某个字段没有返回,而且又是必须的, 像下面这样写,则会抛出异常. //this

IOS开发之—— model最原始的封装,MJExtension加入工程(后续model都继承于它)

DMBasicDataModel.h #import <Foundation/Foundation.h> @interface DMBasicDataModel : NSObject - (id)initWithDictionary:(NSDictionary *)dictionary; @end DMBasicDataModel.m #import "DMBasicDataModel.h" @implementation DMBasicDataModel - (id)in

iOS快速解析Model

平时开发中,当model的属性特别多时,为了提高开发效率,可以使用runtime特性进行解析数据,但性能可能会受点影响,这个办法需要根据项目综合考量来选择. -(instancetype) initWithDictionary:(NSMutableDictionary*) jsonObject { if((self = [super init])) { [self setValuesForKeysWithDictionary:jsonObject]; } return self; } //当可以

iOS—dictionary写入文件出现的几个问题

1.当dictionary中value有null值时,写入文件会失败 2.dictionary赋值给nsmutabledictionary时,需要强制转换  [NSMutableDictionary dictionaryWithDictionary:@"key"]

iOS 字典转model

用property的注意事项: copy: NSString strong: 一般对象 weak:UI控制 assign: 基本数据类型 PS:前面是最基本的model,到后面会对其进行改进. 用模型取代字典理由: **使用字典的坏处 一般情况下,存入数据和取出数据都使用“字典类型的key”,编写这些key时,编译时不会有任何的友善提示,需要手敲,容易出错. dict[@“name”] = @“jack”; NSString *name = dict[@“name”]; **使用模型的好处 1.

如何获取ios 设备名字 model

由于需要获取设备名字,在网上找了一些方法,发现能够解决问题,但是需要做一个匹配,然后设备年年都会出新款,而且设备的种类又很多,所以在获取设备信息后我又做了一个操作,--->我在google上找到了一个网站,发现这个网站有维护一些这种的设备信息,而且查询的条件就是我们从ios系统中获取的machine的值,然后做了个简单的字符串截取.- 结果设备名字就获取到了...,虽然方法不是很保险,但是能用...(备注:这个自己肯定要做一些异常处理..) #import "IOSModelGetter.