当前位置: 首页 > news >正文

JSONModel使用

准备:

JSONModel_下载

JSONModel

快速的解析数据为Model模型,支持层级嵌套Model模型解析,指定类型自动转化,无需手动解析,一行代码搞定!

配合ESJsonFormat插件效果更佳

配合ESJsonFormat效果更佳

基本使用

假设你的 JSON 串像下面这样子:

{"id":"10", "country":"Germany", "dialCode": 49, "isInEurope":true}

创建一个你自己的类,并继承至 JSONModel在你的头文件里面进行声明你所需要的 JSON key值

(#)import "JSONModel.h"@interface CountryModel : JSONModel @property (assign, nonatomic) int id; @property (strong, nonatomic) NSString* country; @property (strong, nonatomic) NSString* dialCode; @property (assign, nonatomic) BOOL isInEurope; @end

.m文件中你不需要做其他的事情了.初始化你的 model ,如下所示:

#import "CountryModel.h"...NSString* json = (fetch here JSON from Internet) ... NSError* err = nil;
CountryModel* country = [[CountryModel alloc] initWithString:json error:&err];
复制代码

如果传过来的 JSON 合法,你所定义的所有的属性都会与该 JSON 值相匹配,并且 JSONModel 也会尝试尽可能的转换成你所想要的数据,就像上面的例子: 转化 "id",从字符串转换成 int 型 拷贝 country 属性的值 转换 dialCode ,从NSNumber 转换为 NSString 值 最后一个呢是将 isInEurope 转换成 BOOL 的属性

所以,你需要做的就是定义出你期望的属性就行了。 例子 例子中所有Model模型都要继承JSONModel

1.命名自动匹配

Model属性名和服务器返回数据字段一致

2.Model关联(model含有其他model)

Model属性名和服务器返回数据字段一致 关联其他Model的属性需要指定自身类型(例如: ProductModel*)

Model关联

3.Model集合(model含有其他model的集合)

**注意:**NSArry后的就<>中包含一个协议,这并不是Objective-C的新语法,他们不会冲突,使用JSONModel必须实现这个协议! 层级嵌套,Model中包含其他Model集合,必须实现该协议!!!

@protocol 协议必须实现!!!(如下图所示)

包含其他Model集合的属性需要指定层级类型和自身类型(例如: NSArray*)

Model集合

4.键映射

在一个Model中获取服务器返回数据不同层级的数据 例如:order_id和name不在同一层级 采用KVC的方式来取值,并赋值给Model属性(order_details.name ---> productName order_details.price.usd ---> price)

5.设置全局键映射(应用于所有model)

全局键映射

6.设置下划线自动转驼峰

自定义把下划线字段解析为驼峰命名属性 场景:服务器数据返回下划线命名字段可为Model中以驼峰命名的属性相应的赋值 mapperFromUpperCaseToLowerCase 大写转小写

7.可选属性(属性值可以为空或null)

某些属性值可以为空 防止由于服务器数据返回空导致JSONModel异常(程序崩溃)

8.忽略属性(属性值可以完全忽略)

解析时会完全忽略它 场景: 该属性值不需要从服务器数据中获取

9.设置所有属性可选(所有属性值可以为空)

Model的所有属性值都可以为空 防止由于服务器数据返回空导致JSONModel异常(程序崩溃) 官方建议尽量避免使用该方法

10.使用内置的HTTP链接

//添加额外的头 [[JSONHTTPClient requestHeaders] setValue:@"MySecret" forKey:@"AuthorizationToken"]; //设置GET,POST请求 [JSONHTTPClient postJSONFromURLWithString:@"mydomain.com/api" params:@{@"postParam1":@"value1"} completion:^(id json, JSONModelError *err) { //检查错误,处理JSON}];

11.将Model导出字典或JOSN字符串

快速导出Model中所有属性和属性值

ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil];pm.name = @"Changed Name";//以字典形式导出NSDictionary* dict = [pm toDictionary];//以字符串形式导出NSString* string = [pm toJSONString];

12.自定义数据处理

添加NSDate转换:根据后台返回时间戳格式进行相应处理 场景:内嵌转换,不能满足需求,需要自定义 JSONModel支持类型:

@implementation JSONValueTransformer (CustomTransformer)//时间戳转NSDate- (NSDate )NSDateFromNSString:(NSString)string { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:APIDateFormat]; return [formatter dateFromString:string];}//NSDate转时间戳- (NSString *)JSONObjectFromNSDate:(NSDate *)date { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:APIDateFormat]; return [formatter stringFromDate:date];}@end

13.自定义处理特殊属性

@interface ProductModel : JSONModel
@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* name;
@property (assign, nonatomic) float price;
@property (strong, nonatomic) NSLocale *locale;
@end

@implementation ProductModel//处理本地化标识后给locale赋值
- (void)setLocaleWithNSString:(NSString*)string {
	self.locale = [NSLocale localeWithLocaleIdentifier:string];
	}
- (NSString *)JSONObjectForLocale { 
	return self.locale.localeIdentifier;
	}
@end
复制代码

14.自定义JSON验证

@interface ProductModel : JSONModel
@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* name;
@property (assign, nonatomic) float price;@property (strong, nonatomic) NSLocale *locale;
@property (strong, nonatomic) NSNumber <Ignore> *minNameLength;
@end

@implementation ProductModel
- (BOOL)validate:(NSError *__autoreleasing *)error { 
	BOOL valid = [super validate:error]; 
	if (self.name.length < self.minNameLength.integerValue { 
    	*error = [NSError errorWithDomain:@"me.mycompany.com" 		code:1 userInfo:nil]; 
    	valid = NO; 
    }
    return valid;
}
@end
复制代码

好的容错能力 自定义数据键值匹配 自动比较以及判断的特性

转载于:https://juejin.im/post/5b9635a7e51d451a3f4bd136

相关文章:

  • 9月10日科技联播:马云将回归教育事业,张勇接任阿里巴巴董事局主席
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • Docker删除镜像
  • mysql 查询当天、本周,本月,上一个月的数据
  • java8之后的时间api
  • 站内全文搜索
  • 登录功能测试点
  • vue项目ide(vue项目环境搭建)
  • 逆地址解析协议RARP
  • linux之history命令
  • 阿里、美团、网易、华为等十余厂秋招Java面经大合集
  • flexible.js 兼容bug修复
  • 2018.09.17python学习第五天part3
  • 2018世界人工智能大会
  • Sort Array By Parity
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • CAP 一致性协议及应用解析
  • MD5加密原理解析及OC版原理实现
  • mockjs让前端开发独立于后端
  • nodejs实现webservice问题总结
  • Vue2.0 实现互斥
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 解决iview多表头动态更改列元素发生的错误
  • 前端
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • Python 之网络式编程
  • # Apache SeaTunnel 究竟是什么?
  • # Panda3d 碰撞检测系统介绍
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (备忘)Java Map 遍历
  • (编译到47%失败)to be deleted
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Net Core和.Net Standard直观理解
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Core中的去虚
  • .net 使用ajax控件后如何调用前端脚本
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @EnableAsync和@Async开始异步任务支持
  • @取消转义
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [C++]:for循环for(int num : nums)
  • [cb]UIGrid+UIStretch的自适应