JSONModel 一个解析 JSON 数据的开源库,可以将 JSON 数据直接解析成自定义的 model .
使用 JSONModel 非常简单,只需要将你的 model 类继承自 JSONModel ,而同时 model 中的属性名又恰巧可以和 JSON 数据中的 key 名字一样的话,那么非常恭喜你,你的工作已经完成90%。
JSONModel 不只使用非常方便而且还会帮你检查 JSON 数据的完整性,如果 JSON 数据不完整的话是要返回 nil 的。它还提供了基本的数据类型转换,比如服务器错将数字传成字符串的话 JSONModel 也会帮你转换成你期望的类型。
添加 JSONModel 到你的工程中
Requirements:
需要的环境:
ARC,iOS 5.0+ / OSX 10.7 +
引入框架SystemConfiguration.framework
Get it as: 1) source files
Download the JSONModel repository as a zip file or clone it
Copy the JSONModel sub-folder into your Xcode project
Link your app to SystemConfiguration.framework
1. 下载 JSONModel zip包
2. 将 JSONModel 文件夹拷贝到你的工程项目中
3. 将库 SystemConfiguration.framework 添加上
or 2) via Cocoa pods
In your project's Podfile add the JSONModel pod:
使用 Cocoa pods 来安装:
pod ‘JSONModel'
接下来简单介绍一下 JSONModel的一些常规使用法则
1. JSONModel自带有 有效性检查,如果指定的服务器返回的某个字段没有返回值,而且该又是必须的, 像下面这样写,则会抛出异常
@property (nonatomic, strong) NSString *Nothing;
一般情况下,我们不想因为服务器的某个值没有返回就使程序崩溃, 我们会加关键字Optional.
@property (nonatomic, strong) NSString <Optional>*Nothing;
2.如果传过来的 JSON 合法,你所定义的所有的属性都会与该 JSON 值相匹配,并且 JSONModel 也会尝试尽可能的转换成你所想要的数据:
// 本来是NSInteger类型直接给转换为 NSString
@property (nonatomic, strong) NSString *city_id;
3自动把下划线方式的命名转为驼峰命名属性。还有类似的,如大写转为小写的方法
@property (nonatomic, strong) NSString *city_name;
// 在.m文件中写上这个方法
+(JSONKeyMapper*)keyMapper
{
return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
}
@property (nonatomic, strong) NSString *cityName;
eg:假设你的 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];
model中含有其他model的集合
{
"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>* products;
@end
键值转回匹配
{
"order_id": 104,
"order_details" : [
{
"name": "Product#1",
"price": {
"usd": 12.95
}
}
]
}
@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"
}];
}
@end
设置全局的键值转回匹配
[JSONModel setGlobalKeyMapper:[
[JSONKeyMapper alloc] initWithDictionary:@{
@"item_id":@"ID",
@"item.name": @"itemName"
}]
];
将下滑线转换成首字母大写
{
"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
内嵌的数据转换, 在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
JSONModel处理数据问题
请求网址: http://api.lanrenzhoumo.com/district/list/allcity?session_id=00004016b3e14bbea40c1aa1a14c2273a35352
请求数据类型
// 方式一
创建一个model 继承JSONModel 声明自己想要的key 在解析数据时我们可以直接使用下面的方法 根据字典创建mode
AmbitusCityTypeModel *model = [[AmbitusCityTypeModel alloc] initWithDictionary:dic error:nil];
// initWithDictionary方法
相当于正常解析时 创建model kvc赋值
//方式二
//根据字典的数组创建model的数组 得到的数组里面都是model类型的数据
self.dataArray = [LoanModel arrayOfModelsFromDictionaries:tempArr];