• 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

  • 相关阅读:
    [eslintpluginvue] [vue/nounusedvars] 'scope' is defined but never used.
    Vue项目中添加锁屏功能
    前端文档汇总(含代码规范、开发流程、知识分享,持续更新)
    vscode格式化Vue出现的问题
    下盘不稳 被忽视的项目风险
    项目沟通中的一点经验心得
    如何才能更合理地分配项目奖金?
    关于企业的薪酬体系之思考
    导致项目失败的两大隐形杀手
    如何让项目总结会议更有效果?
  • 原文地址:https://www.cnblogs.com/codeSnail/p/8944549.html
Copyright © 2020-2023  润新知