JSON转Model内部实现解析
unsigned int outCount = 0;//获得Class c所有属性这里的c是[Model class]objc_property_t *properties = class_copyPropertyList(c, &outCount);for (int i = 0; i < outCount; i++) {objc_property_t propert = properties[i];//获得属性名NSString *key = @(property_getName(propert));//获得属性类型,如CGFloat、nonatomic、copy等信息NSString *type = @(property_getAttributes(propert));NSLog(@"key = %@ , type = %@", key, type);}
Model模型如下
//属性} typedef void(^block)(); @interface Model : NSObject @property (nonatomic, copy) NSString *q_NSString; @property (nonatomic, assign) CGFloat q_CGFloat; @property (nonatomic, assign) CGRect q_CGRect; @property (nonatomic, assign) double q_double; @property (nonatomic, assign) int q_int; @property (nonatomic, assign) BOOL q_bool; @property (nonatomic, assign) float q_float; @property (nonatomic, assign) short q_short; @property (nonatomic, assign) long q_long; @property (nonatomic, assign) long long q_longlong; @property (nonatomic, assign) Point q_point;@property (nonatomic, strong) id q_id; @property (nonatomic, weak) id<NSObject> q_delegate; @property (nonatomic, copy) block q_block; @property (nonatomic, strong) Model1 *q_model1;@property SEL q_SEL; @property Class q_Class; @property Ivar q_Ivar; @property Method q_Method;
输出结果为
key = q_NSString , type = T@"NSString",C,N,V_q_NSString key = q_CGFloat , type = Td,N,V_q_CGFloat key = q_CGRect , type = T{CGRect={CGPoint=dd}{CGSize=dd}},N,V_q_CGRect key = q_double , type = Td,N,V_q_double key = q_int , type = Ti,N,V_q_int key = q_bool , type = TB,N,V_q_bool key = q_float , type = Tf,N,V_q_float key = q_short , type = Ts,N,V_q_short key = q_long , type = Tq,N,V_q_long key = q_longlong , type = Tq,N,V_q_longlong key = q_point , type = T{Point=ss},N,V_q_point key = q_id , type = T@,&,N,V_q_id key = q_delegate , type = T@"<NSObject>",W,N,V_q_delegate key = q_block , type = T@?,C,N,V_q_block key = q_model1 , type = T@"Model1",&,N,V_q_model1 key = q_SEL , type = T:,V_q_SEL key = q_Class , type = T#,&,V_q_Class key = q_Ivar , type = T^{objc_ivar=},V_q_Ivar key = q_Method , type = T^{objc_method=},V_q_Method
- T@“NSNumber” 标记了属于什么类型
- N 线程安全 相当与Objective-C中的nonmatic
- R 不可变,R相当与Objective-C中的readonly,C相当于copy
- Vname 去掉V,name就是变量名
NSString *const MJPropertyTypeInt = @"i"; NSString *const MJPropertyTypeShort = @"s"; NSString *const MJPropertyTypeFloat = @"f"; NSString *const MJPropertyTypeDouble = @"d"; NSString *const MJPropertyTypeLong = @"l"; NSString *const MJPropertyTypeLongLong = @"q"; NSString *const MJPropertyTypeChar = @"c"; NSString *const MJPropertyTypeBOOL1 = @"c"; NSString *const MJPropertyTypeBOOL2 = @"b"; NSString *const MJPropertyTypePointer = @"*";NSString *const MJPropertyTypeIvar = @"^{objc_ivar=}"; NSString *const MJPropertyTypeMethod = @"^{objc_method=}"; NSString *const MJPropertyTypeBlock = @"@?"; NSString *const MJPropertyTypeClass = @"#"; NSString *const MJPropertyTypeSEL = @":"; NSString *const MJPropertyTypeId = @"@";
- 在JSON中为NSNumer,而propertytype为NSString,这种情况很常见。我们就需要处理一下,当propertytype为NSString,而在JSON中为NSNumber,就把NSNumber转化为NSString。
- Readonly不需要赋值
- nil处理
- 可变和不可变处理
- 模型就需要递归处理
- NSString -> NSURL
- 字符串转BOOL
- 还有一些其他处理,以上的处理中也不是每个第三方都进行处理了
if ([value isKindOfClass:[NSStringclass]]) {if (propertyClass == [NSURL class]) {// NSString -> NSURL// 字符串转码value = [value mj_url];} else if (type.isNumberType) {NSString *oldValue = value;// NSString -> NSNumbervalue = [numberFormatter_ numberFromString:oldValue];// 如果是BOOLif (type.isBoolType) {// 字符串转BOOL(字符串没有charValue方法)// 系统会调用字符串的charValue转为BOOL类型NSString *lower = [oldValue lowercaseString];if ([lower isEqualToString:@"yes"] || [lower isEqualToString:@"true"]) {value = @YES;} else if ([lower isEqualToString:@"no"] || [lower isEqualToString:@"false"]) {value = @NO;}}}}
- 采用继承,定义model基类,子类重写父类方法。
- block设置block回调。
- 可以采用抽象基类。
- (id)initWithCoder:(NSCoder *)decoder - (void)encodeWithCoder:(NSCoder *)encoder
+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString {if (jsonString == nil) { return nil;}NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];NSError *error;NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainerserror:&error];if(error) {NSLog(@"json解析失败:%@",error);return nil;}return dic; }
+ (NSString*)dictionaryToJson:(NSDictionary *)dic {NSError *error = nil;NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; }
转载于:https://www.cnblogs.com/booksky/p/5083649.html
JSON转Model内部实现解析相关推荐
- HandyJSON:Swift语言JSON转Model工具库
背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发起网络请求,服务端返回JSON文本,然后客户端解析这个JSON文本,再把对应数据展现到页面上. 但在编程的时候,处 ...
- Codable实现json转Model,是时候干掉HandyJSON了!
自从开始使用Swift做项目,一直都在使用HandyJSON,不可否认,HandyJSON在Swift4.0以前是个好东西,也尝试过其它json转mode的工具,最终发现还是HandyJSON最好用. ...
- swift 访问oracle,Swift实现JSON转Model - HandyJSON使用讲解
很多时候,我们从服务端请求下的数据都是Json格式,我们需要拿这些数据显示到我们的UI界面. 因此,我们的做法基本都会先将json转为方便使用的数据模型,或者也可以直接转字典解决. 在OC中,我们有很 ...
- android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...
####问题描述 * java 解析多层含有泛型对象的json数据获取不到泛型类型 * 如果将泛型改成实际的类型就能正常解析 * 如果不改成实际的类型泛型数据被解析成com.google.gson.i ...
- linux解析json指针,Linux下JSON通信协议的使用和解析
JSON的使用 1.JSON通信协议的概念 2.JSON的语法 2.1JSON对象 2.2JSON数组 2.3JSON字符串 3.JSON的使用与解析 3.1JSON结构体 3.2JSON格式的使用 ...
- flex bison解析json文件_每秒解析千兆字节的 JSON 解析器开源了
本文转自我们的网站 InfoQ,译者无明.除了推荐 simdjson 之外,还想测试一下微信平台编辑器的代码样式功能. 事实证明,微信文章的代码展示能力很强了.非常棒. 近日,GitHub 开源了一 ...
- linux服务器无法解析域名解决办法,Linux服务器内部无法解析域名
Linux服务器内部无法解析域名 问题现象 Linux 服务器内部无法正常解析域名. 问题原因 可能的原因包括: DNS 设置问题 防火墙策略问题 NSCD 服务问题 处理办法 可以依次进行如下检查: ...
- Restful API 生成复杂Json数据结构及使用客户端解析该数据结构(三)
前提说明:首先约定接口之前,需要约定接口的参数,接口参数包括输入参数和输出参数 输入参数:指接口调用时输入的参数 输出参数:即接口调用时返回的参数. 那么如果说,约定输入输出参数均需要采用Json结构 ...
- linux dns无法解析,Linux服务器内部无法解析域名
Linux服务器内部无法解析域名 问题现象 Linux 服务器内部无法正常解析域名. 问题原因 可能的原因包括: DNS 设置问题 防火墙策略问题 NSCD 服务问题 处理办法 可以依次进行如下检查: ...
- kubernetes集群内部DNS解析原理
kubernetes集群内部DNS解析原理 当kubernetes初始化完成后,在kube-system名称空间下会出现kube-dns的service服务与coredns的pod $ kubectl ...
最新文章
- Java Web之POI操作Excel2016模板
- 只需几步,U盘就能变“光驱”
- HDU 1232 - 畅通工程
- 如何发现 GitHub 上那些有趣好玩的项目?
- 面向对象程序设计(OOP)的六大原则
- 字节流写数据的两个小问题
- Moonlight已经可以下载,目前是0.6版
- SAP HANA,S/4HANA 和 SAP BTP 的辨析
- geoserver 3_SD 2-3/15 PR调速阀德国HAWE哈威
- Google 程序员消灭 Bug 的 5 大法宝!
- php更换wordpress用户头像,WordPress主题设置在前台页面添加用户头像教程
- 安装配置文件共享协议(SAMBA)
- 结构专业规范大全_建筑业最新规范大全!拿着手机看规范、查标准,超级方便...
- 都能看懂的嵌入式linux/android alsa_aplay alsa_amixer命令行使用方法
- Win11查看电脑磁盘分区格式的方法教学
- JNI/NDK入门指南之JNI数据类型,描述符详解
- 个人邮箱地址格式,如何能够正确的书写?
- 前端 css 自动生成,关于前端:利用Zeplin从设计图自动生成CSS提高前端样式开发效率...
- java rotateright_Java Tetris旋转
- 常用的web服务器有哪些
热门文章
- 如何使用 AirDrop 将 MAC 中的照片整理好,并上传到 iPhone 的相册中?
- MacBook 键盘出现故障,如何修复?
- freeCodeCamp 221题
- recyclerview简单实现单选多选反选全选
- SDUT OJ 3403 数据结构实验之排序六:希尔排序
- 《HTML5游戏编程核心技术与实战》——2.3 图像API
- “System.FormatException”类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效。...
- #openssl #爆重大漏洞heartbleed,危及两亿网民!!!
- uva 10246(变形floyd)
- [分享]如何开机后直接进入桌面