• 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
  • 相关阅读:
    java高并发程序设计模式-并发级别:阻塞、无障碍、无锁、无等待【转载】
    Java创建线程的三种主要方式
    Java乐观锁实现之CAS操作
    Java解释执行和编译执行
    手把手教你使用百度大脑地址识别API
    详解百度大脑EdgeBoard出色的视频处理技术
    一步到位!!百度大脑语音合成快速搞定会员到访提醒功能
    一文带你了解百度大脑云狐语音全攻略(附代码)
    AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略!!
    快速上手百度大脑EasyDL专业版·物体检测模型(附代码)
  • 原文地址:https://www.cnblogs.com/enya1999/p/4260561.html
Copyright © 2020-2023  润新知