• iOS反射:把对象直接转化成NSDictionary


    在IOS的网络编程中,通常我们需要将一些实体数据保存到NSDictionary,在获得NSDictionary后即可直接使用iOS 5后的NSJSONSerialization类型的dataWithJSONObject方法就可以返回包含JSON字符串的NSData对象了。然后调用ASIHttpRequest。

    如果类属性中还包含其他类,或更多的嵌套下怎么办呢,自己来编写会非常复杂,这里我们可以通过反射来编写,基本思路就是通过反射获得属性名称,通过KVC获得值,剩下的就是NSDictionary和NSArray的循环嵌套了。

    IOS的反射引用<objc/runtime.h>,使用方法为class_copyPropertyList和property_getName

    注意原来代码中之引用了NSString,NSNumber,NSNull类型的支持,可以加入更多的类型,根据需要添加吧我添加了NSDate类型

    反射的详细介绍官方网址:点击

    示例代码

    #import <Foundation/Foundation.h>
    
    @interface BIDObjectToNsDictionary : NSObject
    + (NSDictionary*)getObjectData:(id)obj;
    @end
    #import "BIDObjectToNsDictionary.h"
    #import <objc/runtime.h>
    + (NSDictionary*)getObjectData:(id)obj
    {
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        unsigned int propsCount;
        objc_property_t *props = class_copyPropertyList([obj class], &propsCount);//获得属性列表
        for(int i = 0;i < propsCount; i++)
        {
            objc_property_t prop = props[i];
            
            NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];//获得属性的名称
            id value = [obj valueForKey:propName];//kvc读值
            if(value == nil)
            {
                value = [NSNull null];
            }
            else
            {
                value = [self getObjectInternal:value];//自定义处理数组,字典,其他类
            }
            [dic setObject:value forKey:propName];
        }
        return dic;
    }
    + (id)getObjectInternal:(id)obj
    {
        if([obj isKindOfClass:[NSString class]]
           || [obj isKindOfClass:[NSNumber class]]
           || [obj isKindOfClass:[NSNull class]]
        || [obj isKindOfClass:[NSDate class]])//支持类型-----可以扩充 {
    return obj; } if([obj isKindOfClass:[NSArray class]]) { NSArray *objarr = obj; NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count]; for(int i = 0;i < objarr.count; i++) { [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i]; } return arr; } if([obj isKindOfClass:[NSDictionary class]]) { NSDictionary *objdic = obj; NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]]; for(NSString *key in objdic.allKeys) { [dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];//对字典类型进行解析,递归调用 } return dic; } return [self getObjectData:obj];//对其他class解析,递归调用 @end

    参考原文http://ios.9tech.cn/news/2013/0918/28899.html

  • 相关阅读:
    关于MYSQL 和INNODB的逻辑关系图。最好的理解是一点点动手做,观察,记录,思考。
    MYSQL的DOUBLE WRITE双写
    MYSQL 中binlog 参数的记录
    How to install pip
    gdb
    vim的基本使用
    012_fieldset.html
    010_header.html
    011_label.html
    008_img.html
  • 原文地址:https://www.cnblogs.com/keithmoring/p/4136874.html
Copyright © 2020-2023  润新知