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

原文地址:https://www.cnblogs.com/codeSnail/p/8944549.html

时间: 2024-11-05 19:48:43

Objective-C Json转Model(利用Runtime特性)的相关文章

利用runtime解析model

利用runtime解析model by 伍雪颖 + (instancetype)modelWithDictionary: (NSDictionary *) data{ return [[self alloc] initWithDictionary:data]; } - (instancetype)initWithDictionary: (NSDictionary *) data{ { self = [super init]; if (self) { [self assginToPropertyW

(2)预期+思考【利用objective-c的runtime特性,结合FMDB实现轻量级的ORM】

版权声明:本文为博主原创文章,未经博主允许不得转载. 本次利用一个常见的数据库关系例子说明本ORM的基本需求.   班级.学生 这一对表,关系为1对多,班级表主键id,学生表主键num.外键班级id.   表结构如下: 班级表class结构 学生student表: 程序中对应的实体类分别是:班级实体(ClassEntity),学生实体(Student) 其基本objective-c类结构如下: @interface ClassEntity : NSObject @property (nonato

iOS中利用 runtime 一键改变字体

http://www.cocoachina.com/ios/20160504/16109.html 本文为投稿文章,作者:HenryCheng(简书) 最近公司要在5月份举办个大型的发布会,所以在这之前要把版本稳定,界面提升,所以有很多细活要干.不过,趁前两天版本刚提交上线,这两天稍微闲一点,就把之前说的利用runtime一键改变字体的方法分享出来.有人会说,改变字体不是很简单吗,我直接找到字体名替换一下不就好了?客官不要急,先坐下来吃点瓜子,听我慢慢给你说来. 1.准备 我们新建一个项目名叫C

利用runtime动态生成对象?

利用runtime我们能够动态生成对象.属性.方法这特性 假定我们要动态生成DYViewController,并为它创建属性propertyName 1)对象名 NSString *class = @"DYViewController"; const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding]; 2)从一个字符串返回一个Class Class newClass = objc_getClass(

编写高质量代码改善C#程序的157个建议——建议55:利用定制特性减少可序列化的字段

建议55:利用定制特性减少可序列化的字段 特性(attribute)可以声明式地为代码中的目标元素添加注释.运行时可以通过查询这些托管块中的元数据信息,达到改变目标元素运行时行为的目的.System.Runtime.Serialization命名空间下,有4个这样的特性: OnDeserializedAttribute,当它应用于某方法时,会指定在对象反序列化后立即调用此方法. OnDeserializingAttribute,当他应用于某方法是,会指定在反序列化对象时调用此方法. OnSeri

利用runtime实现更加灵活的KVC

字典转模型在iOS开发中属于非常常见的操作. 比较简单的方式是 KVC ,但是这样会有一个局限 ,就是 模型中的属性必须和字典中的完全匹配,否则,KVC将会报错. 手动编写代码虽然比较灵活,但是如果字典中数据量庞大,也会是一个糟糕的体验. 针对以上问题,利用runtime实现一个更加灵活的字典转模型. 1.为 NSObject建立一个分类 NSObject+GQRuntimeTool.h文件 #import <Foundation/Foundation.h> @interface NSObje

ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型

一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字典,得到所有的key,value值,再利用kvc, setVaue forkey来为value赋值 2: [item setValue:@"来自即刻笔记" forKey:@"source"],内部的底层实现, 1.首先去模型中查找有没有setSource,找到,直接调用

使AJAX调用尽可能利用缓存特性

优化网站设计(十四):使AJAX调用尽可能利用缓存特性 前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议.这方面的研究一直没有停止过,我在不同的场合也分享过这样的话题. 作为通用的原则,雅虎的工程师团队曾经给出过35个最佳实践.这个列表请参考  Best Practices for Speeding Up Your Web Site http://developer.yahoo.com/performance/rules.html,同时,他们还发布了一个相应

Flutter json 2 model with Built Value

Flutter json 2 model with Built Value Flutter中json转换model, 除了手动转之外, 就是利用第三方库做一些代码生成. 流行的库有: json_serializable和built_value 本文介绍built_value的实际使用及问题处理. Flutter中的json转model方法 Flutter中json到model类型的转换可以有多种方式: 利用官方自带的dart convert中的json解码. 该方法只能将json转换为List或