本文转自:http://blog.csdn.net/smking/article/details/40432287

下面讲一下JSONModel的使用方法。

@inteface MyModel : JSONModel

1. 使用JSONModel时,不需要额外去检查所要的服务器属性是否有返回。JSONModel的initWithDictionary方法会自动去进行检查并处理。

2. 有效性检查,如果指定的服务器返回的某个字段没有返回,而且又是必须的, 像下面这样写,则会抛出异常。

//this property is required

@property (strong, nonatomic) NSString* string;

因为默认这个值是必须的。

一般情况下,我们不想因为服务器的某个值没有返回就使程序崩溃, 我们会加关键字Optional.

//this one's optional

@property (strong, nonatomic) NSNumber<Optional>* number;

3. 原子数据, 之前可能是如下面这样操作数据

if (jsonDict[@"name"])

labelName.text = jsonDict[@"name"];

else

[self showErrorMessageAndBailout];

这段代码会使得jsonDict[@"name"], 会被读取,然后进行有效性判断,最后再被使用。 换句话来说,这里使用了三次, 而如果某些情况下,使用一次就已经出错,但却无法阻止它接下来的连续出错。

而如果使用JSONModel的属性,则只会保证上面只使用一次,就可以进行有效性的判断以及使用。(其实上面也可以做到,只需要把这个值取出来,存下来接着使用却可,但是代码会稍显麻烦)

同时读取一批数据如下面代码:

简单模型如下:

SimpleModel* model = [[SimpleModel alloc] initWithString:@"...json here..." error:nil];

 

复杂模型如下, 这里假设复杂模型包含了简单模型。主要是为了说明模型之前的包含情况下,照样可以进行解析。


SuperComplicatedModel* model = [[SuperComplicatedModel alloc] initWithString:@"...json here..." error:nil];

 

模型的批处理,即一次可以处理一批模型。


NSArray* models = [SuperComplicatedModel arrayOfObjectsFromDictionaries: jsonDatas error:nil];

 

4. 数据转换, OC <-> JSON

注意下面这张图:这意味着JSON的数据格式只有中间的部分, string,number, array, object, 以及null

例如有如下 JSON数据:


{

"first" : 1,

"second": 35,

"third" : 10034,

"fourth": 10000

}

 

可以如下定义这个模型


@interface NumbersModel:JSONModel

@property (assign,nonatomic) short first;

@property (assign,nonatomic) double second;

@property (strong,nonatomic) NSNumber* third;

@property (strong,nonatomic) NSString* fourth;

@end

注:JSON数据中, first为1,second为35, 但是它们却可以自动被转换成short, double类型。 对于10034, 以及10000会自动转换为NSNumber以及NSString。 这些都是JSONModel会自动进行的。 神奇吧!

5. 内嵌的数据转换, 在JSONValueTransformer类中,有各种内嵌的转换支持。如下面

{

"purchaseDate" : "2012-11-26T10:00:01+02:00",

"blogURL" : "http://www.touch-code-magazine.com"

}

分别是一个 日期类型,以及一个URL类型。

@interface SmartModel: JSONModel

@property (strong, nonatomic) NSDate* purchaseDate;

@property (strong, nonatomic) NSURL* blogUrl;

@end


用上面这个模型,不需要其它代码,即可以得到想要的转换 。

这个JSONValueTransformer类中有如下支持的转换

NSMutableString <-> NSString

NSMutableArray <-> NSArray

NS(Mutable)Array <- JSONModelArray

NSMutableDictionary <-> NSDictionary

NSSet <-> NSArray

BOOL <-> number/string

string <-> number

string <-> url

string <-> time zone

string <-> date

number <-> date

6. 自定义数据转换, 显然上面的内嵌转换有时不能满足我们的需要,所以我们需要如下的自定义转换。

你需要做的就是自定义一个JSONValueTransformer的类别文件,如下:

@interface JSONValueTransformer(UIColor)

-(UIColor*)UIColorFromNSString:(NSString*)string;

-(id)JSONObjectFromUIColor:(UIColor*)color;

@end

然后再进行实现即可。

注意上面的命名是采用:

-(YourPropertyClass*)YourPropertyClassFromJSONObjectClass:(JSONObjectClass*)name;

 

例如:

-(UIColor*)UIColorFromNSString:(NSString*)string;

 

而要把这个类型转换为JSON,则像这样即可:(注下面这个id,可以修改也可以不用修改成NSString,因为一定知道这是一个nsstirng.  heqin:这里其实也可能会是其它类的,应该是根据特定情况来特定判断。)

-(id)JSONObjectFromYourPropertyClass:(YourPropertyClass*)color;

 

如下是另一个例子:

@implementation JSONValueTransformer (CustomTransformer)

- (NSDate *)NSDateFromNSString:(NSString*)string {

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:APIDateFormat];

return [formatter dateFromString:string];

}

- (NSString *)JSONObjectFromNSDate:(NSDate *)date {

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:APIDateFormat];

return [formatter stringFromDate:date];

}

@end

7. 层级嵌套。

{

"idImage": 1,

"name": "house.jpg",

"copyright": {"author":"Marin Todorov", "year":2012}

}

可以先定义如下的模型

@interface CopyModel: JSONModel

@property (strong, nonatomic) NSString* author;

@property (assign, nonatomic) int year;

@end

 
然后再定义模型:

#import "CopyModel.h"

@interface ImageModel: JSONModel

@property (assign, nonatomic) int idImage;

@property (strong, nonatomic) NSString* name;

@property (strong, nonatomic) CopyModel* copyright;

@end

然后在你得到的ImageModel后, 就会发现其中的CopyModel也有数据了。

如果你想要一个数组的模型属性,如下即可。

@property (strong, nonatomic) NSArray<TweetModel>* tweets;

 

8. JSONModel转换为Dictioanry, JSONString.

直接使用JSONModel的方法toDictioanry, 以及toJSONString即可。

9. 保存model数据

NSDictionary* object = [NSDictionary dictionaryWithContentsOfFile:filePath];

data = [[MyDataModel alloc] initWithDictionary: object];

//保存操作

[[data toDictionary] writeToFile:filePath atomically:YES];

 

10. Key mapping, 有时, 得到的数据不是在一个层级,如下:

{

"order_id": 104,

"order_details" : [

{

"name": "Product#1",

"price": {

"usd": 12.95

}

}

]

}

 

其中的order_id与name就不是一个层级,但我们仍然想在一个model中得到它们的数据。 如下:

@interface OrderModel : JSONModel

@property (assign, nonatomic) int id;

@property (assign, nonatomic) float price;

@property (strong, nonatomic) NSString* productName;

@end

@implementation OrderModel

+(JSONKeyMapper*)keyMapper

{

return [[JSONKeyMapper alloc] initWithDictionary:@{

@"order_id": @"id",

@"order_details.name": @"productName",

@"order_details.price.usd": @"price" // 这里就采用了KVC的方式来取值,它赋给price属性

}];

}

@end

 

11. 全局Global key mapping. (使所有的模型都具备), 个人觉得这个并不是非常通用,因为如果真是需要所有模型都具备这个keyMapper的转换,则直接继承一个基类就行了。

[JSONModel setGlobalKeyMapper:[

[JSONKeyMapper alloc] initWithDictionary:@{

@"item_id":@"ID",

@"item.name": @"itemName"

}]

];

12. 自动把下划线方式的命名转为驼峰命名属性。还有类似的,如大写转为小写的方法:mapperFromUpperCaseToLowerCase

{

"order_id": 104,

"order_product" : @"Product#1",

"order_price" : 12.95

}

生成的模型

@interface OrderModel : JSONModel

@property (assign, nonatomic) int orderId;

@property (assign, nonatomic) float orderPrice;

@property (strong, nonatomic) NSString* orderProduct;

@end

@implementation OrderModel

+(JSONKeyMapper*)keyMapper

{

return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];

}

@end

13. 可选属性,建议尽量使用这种方式来避免异常。

{

"id": "123",

"name": null,

"price": 12.95

}

 

生成的模型如下:

@interface ProductModel : JSONModel

@property (assign, nonatomic) int id;

@property (strong, nonatomic) NSString<Optional>* name;

@property (assign, nonatomic) float price;

@property (strong, nonatomic) NSNumber<Optional>* uuid;

@end

@implementation ProductModel

@end

通过上面的optional的方式, 我们可以给这个类添加一个isSuccess方法,该方法中判断name和uuid是否存在来决定是否从服务器成功取数据。 而不是把这两个属性设置为required,可以有效避免异常。

14. Ignore属性, 会使得解析时会完全忽略它。 一般情况下,忽略的属性主要用在该值不从服务器获取,而是通过后面的代码进行设置。

{

"id": "123",

"name": null

}

模型为:

@interface ProductModel : JSONModel

@property (assign, nonatomic) int id;

@property (strong, nonatomic) NSString<Ignore>* customProperty;

@end

@implementation ProductModel

@end

可以用下面方法,使当前类的全部属性都为可选,官网上说尽量避免这样的使用, (个人觉得官网的意思是指,尽量避免用来面方法来指定所有的属性为可选,即使要全部属性为可选,也尽量是在每个属性那里标注为Optional)

@implementation ProductModel

+(BOOL)propertyIsOptional:(NSString*)propertyName

{

return YES;

}

@end

15. 延迟加载, 这种比较推荐,可以减少在网络读取时的性能消耗:关键字为: ConvertOnDemand

{

"order_id": 104,

"total_price": 103.45,

"products" : [

{

"id": "123",

"name": "Product #1",

"price": 12.95

},

{

"id": "137",

"name": "Product #2",

"price": 82.95

}

]

}

使用模型:

@protocol ProductModel

@end

@interface ProductModel : JSONModel

@property (assign, nonatomic) int id;

@property (strong, nonatomic) NSString* name;

@property (assign, nonatomic) float price;

@end

@implementation ProductModel

@end

@interface OrderModel : JSONModel

@property (assign, nonatomic) int order_id;

@property (assign, nonatomic) float total_price;

@property (strong, nonatomic) NSArray<ProductModel, ConvertOnDemand>* products;

@end

@implementation OrderModel

@end

16. 使用JSONHttpClient进行请求。

//add extra headers

[[JSONHTTPClient requestHeaders] setValue:@"MySecret" forKey:@"AuthorizationToken"];

//make post, get requests

[JSONHTTPClient postJSONFromURLWithString:@"http://mydomain.com/api"

params:@{@"postParam1":@"value1"}

completion:^(id json, JSONModelError *err) {

//check err, process json ...

}];

好了, 所以的JSONModel的使用方法都已经在这里了, 综合了官网的使用方法。

iOS JsonModel 的使用的更多相关文章

  1. iOS JsonModel

    iOS JsonModel 的使用 本文转自:http://blog.csdn.net/smking/article/details/40432287 下面讲一下JSONModel的使用方法. @in ...

  2. 【iOS】在Swift中使用JSONModel

    前言 首先所有的Model还是使用oc来写——看到这一句是不是想关网页了- - #,在swift里面直接写一直报错所以就将就用oc来写了,这里主要是分享一下搭配Alamofire使用的经验. 声明 欢 ...

  3. iOS中JSONModel的使用

    iOS中JSONModel的使用   流弊的JSON数据模型框架 https://github.com/jsonmodel/jsonmodel 版本 1.3.0 如果你喜欢JSONModel,并且使用 ...

  4. iOS 中JSONModel的使用

    基本使用 涉想你的JSON数据像这样: { "id": "10", "country": "Germany", &quo ...

  5. iOS开发解决 jsonModel 属性跟系统的重复

    -(id)initWithDic:(NSDictionary *)dic { if (self = [super init]) { [self setValuesForKeysWithDictiona ...

  6. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  7. 开源 iOS 项目分类索引大全 - 待整理

    开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...

  8. 分享iOS开发常用(三方类库,工具,高仿APP,实用网站,技术干货)

    一 . JSONModel  (三方类库会有更新,建议大家在线下载) http://pan.baidu.com/s/1i5ybP1z 二.AFNetworkiong http://pan.baidu. ...

  9. iOS常用第三方开源框架和优秀开发者博客等

    博客收藏iOS开发过程好的开源框架.开源项目.Xcode工具插件.Mac软件.文章等,会不断更新维护,希望对你们有帮助.如果有推荐或者建议,请到此处提交推荐或者联系我. 该文档已提交GitHub,点击 ...

随机推荐

  1. 借助node实战JSONP跨域

    一.前言: 浏览器安全是基于同源策略的.所谓同源策略就是三相同: 1.协议相同: 2.域名相同: 3.端口相同. 但,凡事都是有利弊,同源策略也导致了我们想用AJAX跨域请求,但NO!!为了规避这种限 ...

  2. Javascript之一切皆为对象1

    在javascript的世界里,有这么一句话,一切皆为对象. 但是这个对象,应该怎么理解呢? OMG,难道值类型也是对象?!! 当然,不是. 准确地讲是对于“引用类型”而言. 那,在JavaScrip ...

  3. WebStorm按Tab建快速生成代码模块

    WS中,比如调试每次都要写的console.log(xxx);每次都要敲一遍,还有if模块,for循环模块,难道没有快捷键,可以生成代码模块吗,答案是“有”. 操作步骤如下(汉化版WS): 1.Alt ...

  4. 介绍一个很爽的 php 字符串特定检索函数---strpos()

    大家在用 php 开发的时候 是否 有遇到过,对于一个获取的字符串,如果想要特定检测它是否 含有某个特定的字符或者子字符串,总是找不到好方法,或者根本做不到,迫于无奈而使用foreach. 函数: s ...

  5. android 通过访问 php 接受 or 传送数据

    先说传送数据,可以在 利用 php 代替传送,直接把 访问的url加上 xxx.php?informatin=xxxxxx 就行了 接收的看代码吧,详细注释. 首先是 我自己定义的php 文件 < ...

  6. C语言 第七章 数组与字符串

    一.数组 1.1.数组的概念 用来存储一组相同类型数据的数据结构.有点像班上放手机的手机袋,超市的储物柜. 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. ...

  7. Oracle内存管理技术

    1.Oracle内存管理技术 2.配置自动内存管理(AMM) 3.监视自动内存管理(AMM) 4.配置自动共享内存管理(ASMM) 5.配置自动PGA内存管理 Reference 1.Oracle内存 ...

  8. 1Z0-053 争议题目解析681

    1Z0-053 争议题目解析681 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 681.The environmental variable ORACLE-BASE is set ...

  9. 相克军_Oracle体系_随堂笔记002-基础

    1.常见的Oracle生产库环境: 图2-1可以说是标准的生产库环境,处处体现了冗余,有效防止了单点故障.这就是HA(高可用) 而且冗在某种条件下还可以去掉,平常实现同时运行提供服务,如果一台坏掉,另 ...

  10. jQuery动画

    一.显示和隐藏 hide().show() 1.show():显示被选的元素 2.hide():隐藏被选的元素 3.toggle():对被选元素进行隐藏和显示的切换 语法: $(selector).h ...