zoukankan      html  css  js  c++  java
  • Objective-C Json转Model(利用Runtime特性)

    封装initWithNSDictionary:方法###

    该方法接收NSDictionary对象, 返回PersonModel对象.#

    #pragma mark - 使用runtime将JSON转成Model
    - (void)json2Model {
       `NSString *file = [[NSBundle mainBundle] pathForResource:@"Persons" ofType:@"json"];`
        NSData *data = [NSData dataWithContentsOfFile:file];
        NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    
        for (NSDictionary *model in array) {
            PersonModel *person = [[PersonModel alloc] initWithNSDictionary:model];
            NSLog(@"%@, %ld, %@, %@", person.name, (long)person.age, person.city, person.job);
        }
    }
    

    使用runtime实现###

    PersonModel的头文件如下:#

    #import <Foundation/Foundation.h>
    @interface PersonModel : NSObject
    
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) NSInteger age;
    @property (nonatomic, copy) NSString *city;
    @property (nonatomic, copy) NSString *job;
    
    - (instancetype)initWithNSDictionary:(NSDictionary *)dict;
    
    @end
    

    实现文件:

    #import "PersonModel.h"
    #import <objc/runtime.h>
    
    @implementation PersonModel
    
    - (instancetype)initWithNSDictionary:(NSDictionary *)dict {
        self = [super init];
        if (self) {
            [self prepareModel:dict];
        }
        return self;
    }
    
    - (void)prepareModel:(NSDictionary *)dict {
        NSMutableArray *keys = [[NSMutableArray alloc] init];
    
        u_int count = 0;
        objc_property_t *properties = class_copyPropertyList([self class], &count);
        for (int i = 0; i < count; i++) {
            objc_property_t property = properties[i];
            const char *propertyCString = property_getName(property);
            NSString *propertyName = [NSString stringWithCString:propertyCString encoding:NSUTF8StringEncoding];
            [keys addObject:propertyName];
        }
        free(properties);
    
        for (NSString *key in keys) {
            if ([dict valueForKey:key]) {
                [self setValue:[dict valueForKey:key] forKey:key];
            }
        }
    }
    
    @end
    

    其中的代码也很简单:

    使用class_copyPropertyList获取Model的所有属性列表, 遍历该列表使用property_getName即可得到所有属性名. 
    对于PersonModel中定义的属性, 使用KVC即可将dict中的值赋给该属性.
    

    转自:[id]:https://blog.csdn.net/icetime17/article/details/52040301

  • 相关阅读:
    记一次生产环境Nginx间歇性502的事故分析过程
    如何为nginx配置https(免费证书)
    nginx + tomcat配置https的两种方法
    证书之间的转换(crt pem key)
    FreeSwitch: ESL Inbound内联模式下如何设置单腿变量
    CompletableFuture笔记
    java中整数常量池(-128~127)上限如何调整?
    redis过期机制及注意事项
    一次完整的通话过程SIP报文分析
    SIPp测试freeswitch用户注册
  • 原文地址:https://www.cnblogs.com/codeSnail/p/8944549.html
Copyright © 2011-2022 走看看