首页 > 代码库 > iOS中JSONModel的使用
iOS中JSONModel的使用
iOS中JSONModel的使用
流弊的JSON数据模型框架
https://github.com/jsonmodel/jsonmodel
版本 1.3.0
如果你喜欢JSONModel,并且使用了它,请你:
star一下
给我一些反馈. 多谢!
JSONModel 是一个能够快速巧妙的创建数据模型的库. 你可以在 iOS or OSX APP中使用它.
JSONModel 自动检查JOSN模型和结构体, 彻底的减少你的代码量.
添加JSONModel到你的项目中
要求
- 支持持ARC; iOS 5.0+ / OSX 10.7+
- SystemConfiguration.framework
as: 1) 源文件
1.下载JSONModel.zip文件
2.将它拷贝到你的项目中
3.导入SystemConfiguration.framework框架
or 2)使用 CocoaPods
pod ‘JSONModel‘
如果你想关于CocoaPods了解更多,请参考这个简单的教程.
or 3) 使用 Carthage
在你的项目的Cartfile添加JSONModel:
github "jsonmodel/jsonmodel"
文档
你可以查看在线阅读文档: http://cocoadocs.org/docsets/JSONModel
基本使用
涉想你的JSON数据像这样:
{ "id": "10", "country": "Germany", "dialCode": 49, "isInEurope": true }
- 为你的数据模型创建一个Objective-C的类,继承自JSONModel.
- 将JSON中的keys在.h文件中声明为属性:
#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的值
- 转换diaCode,从number转换为字符串
- 最后一个是将isInEurope转换为BOOL属性
所以,你所需要做的就是将你的属性定义为期望的类型.
在线教程
官方网站: http://www.jsonmodel.com
在线文档: http://jsonmodel.com/docs/
傻瓜教程:
How to fetch and parse JSON by using data models
Performance optimisation for working with JSON feeds via JSONModel
How to make a YouTube app using MGBox and JSONModel
举个栗子
命名自动匹配
{ "id": "123", "name": "Product name", "price": 12.95}
@interface ProductModel : JSONModel@property (assign, nonatomic) int id;@property (strong, nonatomic) NSString* name;@property (assign, nonatomic) float price;@end@implementation ProductModel@end
模型嵌套 (模型包含其他模型)
{ "order_id": 104, "total_price": 13.45, "product" : { "id": "123", "name": "Product name", "price": 12.95 }}@interface OrderModel : JSONModel@property (assign, nonatomic) int order_id;@property (assign, nonatomic) float total_price;@property (strong, nonatomic) ProductModel* product;@end@implementation OrderModel@end
模型集合
{ "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@implementation OrderModel@end
注意: 尖括号后 NSArray
包含一个协议. 这跟Objective-C原生的泛型不是一个概念. 他们不会冲突, 但对于JSONModel来说,协议必须在一个地方声明.
key映射
{ "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
设置全局键映射(应用于所有model)
[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
可选属性 (就是说这个属性可以为null或者为空)
{ "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
忽略属性 (就是完全忽略这个属性)
{ "id": "123", "name": null}
@interface ProductModel : JSONModel@property (assign, nonatomic) int id;@property (strong, nonatomic) NSString<Ignore>* customProperty;@end@implementation ProductModel@end
设置所有的属性为可选(所有属性值可以为空)
@implementation ProductModel+(BOOL)propertyIsOptional:(NSString*)propertyName{ return YES;}@end
使用JSONModel自带的 HTTP 请求
//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 ... }];
将model转化为字典或者json格式的字符串
ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil];pm.name = @"Changed Name";//convert to dictionaryNSDictionary* dict = [pm toDictionary];//convert to textNSString* string = [pm toJSONString];
自定义数据的转换
@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
自定义处理指定的属性
@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// Convert and assign the locale property- (void)setLocaleWithNSString:(NSString*)string { self.locale = [NSLocale localeWithLocaleIdentifier:string];}- (NSString *)JSONObjectForLocale { return self.locale.localeIdentifier;}@end
自定义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
- 错误处理
- 自定义数据校验
- 自动比较和相等判断
- 更多.
Misc
作者: Marin Todorov
参与者: Christian Hoffmann, Mark Joslin, Julien Vignali, Symvaro GmbH, BB9z.
任何人都可以 pull requests.
更新log : https://github.com/jsonmodel/jsonmodel/blob/master/CHANGELOG.md
Utility to generate JSONModel classes from JSON data:https://github.com/dofork/json2object
许可
This code is distributed under the terms and conditions of the MIT license.
参考指南
NB! 如果你解决了你发现的某个BUG, 请添加单元测试,这样以便我在合并之前复现这个BUG.
使用问题汇总
1、1.4.0版本的JSONKeyMapper
如果需要替换服务端返回来的key,需要按照下面的结构@{@"你的key":@"接口返回的key"},并且请使用initWithModelToJSONDictionary这个方法。
+ (JSONKeyMapper *)keyMapper { return [[JSONKeyMapper alloc] initWithModelToJSONDictionary: @{ @"isChecked":@"ischecked", @"tagId":@"tagid", @"tagName":@"tagname", @"tagValue":@"tagvalue" }];}
2、模型包含模型时的使用, 被包含的模型需要声明protocol
eg:KSAlreadyBuyListModel 包含一个属性KSAlreadyBuyModel, 我们需要将KSAlreadyBuyModel声明protocol,不然会解析失败。
@class StoryModel, AblumModel;@protocol KSAlreadyBuyModel <NSObject>@end@interface KSAlreadyBuyModel : KSBaseModel@property (nonatomic, strong) StoryModel *storyModel;@property (nonatomic, strong) AblumModel *ablumModel;@end@protocol KSAlreadyBuyListModel <NSObject>@end@interface KSAlreadyBuyListModel : KSBaseModel@property (nonatomic, copy) NSString *contentid;@property (nonatomic, copy) NSString *contenttype;@property (nonatomic, copy) NSString *iconurl;@property (nonatomic, copy) NSString *orderno;@property (nonatomic, copy) NSString *productid;@property (nonatomic, copy) NSString *productname;@property (nonatomic, copy) NSString *realityprice;@property (nonatomic, strong) KSAlreadyBuyModel *param;@end
iOS中JSONModel的使用