JSONModel使用

准备:

JSONModel_下载

JSONModel

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

配合ESJsonFormat插件效果更佳

ESJSONFormatter_下载
ESJSONFormatter_下载


配合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<ProductModel>*)

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:@"http://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支持类型:

json支持类型

@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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • 准备: JSONModel_下载 快速的解析数据为Model模型,支持层级嵌套Model模型解析,指定类型自动转化...
    LuisX阅读 13,000评论 22 104
  • JSONModel是json转model的第三方开源库。当我们向服务器发送一个请求之后,通过JSONModel把数...
    帅只是表象阅读 11,817评论 3 26
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,139评论 30 470
  • MVVM模式与团队合作 说到架构设计和团队协作,这个对App的开发还是比较重要的。即使作为一个专业的搬砖者,前提是...
    GitHubPorter阅读 6,663评论 9 19
  • 今天读了一本书《为创意痴狂,愉快地反转地球》,感悟很深。 “每个人身上都潜藏着无限创意。只是,并不是所有人都能让它...
    奇妙静静阅读 848评论 0 1