在部门,我们喜欢 JSONModel 的声明性对象建模方法,但我们同样喜欢 Plist 文件对 NSDate 和 NSValue 等的本地支持。主要的 JSONModel 仓库名字缺少一些扩展选项,这些选项可以指定特定数据源支持比 JSON 更多的数据类型。此外,无关的是,它还缺少扩展序列化到其他类型的功能。
JSONModel 的作者 Marin Todorov 合理化地希望将根仓库集中在 JSON 上,因此我们开始维护这个分叉。这个分支与 JSONModel 0.9.1 版本功能相同,并提供了一些在头文件中记录的额外功能。README 已更新 :)。
JSONModel 是一个库,它允许快速创建智能数据模型。您可以在 iOS 或 OSX 应用于中用它。
JSONModel 自动检查模型类和您的 JSON 输入的结构,从而大大减少您需要编写的代码量。
在项目中 Podfile 添加 JSONModel pod
pod 'JSONModel'
如果您想了解更多关于 CocoaPods 的内容,请查看 这篇简短的教程。
源代码包括类文档,您可以自己编译并将其导入到 Xcode 中
brew install appledoc
。appledoc .
安装文档。假设你有一个这样的JSON
{id:"10", "country":"Germany", "dialCode": 49, "isInEurope":true}
#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文件中不需要做任何事情。
#import "CountryModel.h"
...
NSString* json = (fetch here JSON from Internet) ...
NSError* err = nil;
CountryModel* country = [[CountryModel alloc] initWithString:json error:&err];
如果JSON的验证通过,你的模型中的所有对应属性都将从JSON中填充。JSONModel还会尝试将尽可能多的数据转换为预期的类型,在上面的例子中,它会
好消息是,你所需要做的只是定义属性和它们预期的类型。
在线类文档:http://jsonmodel.com/docs/
分步教程
{ "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 |
{ "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 |
{ "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 |
{ "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 |
//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 ...
}];
ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil];
pm.name = @"Changed Name";
//convert to dictionary
NSDictionary* dict = [pm toDictionary];
//convert to text
NSString* string = [pm toJSONString];
贡献者:Christian Hoffmann、Mark Joslin、Julien Vignali、Symvaro GmbH、BB9z。还有所有成功提交pull请求的人。
变更日志: https://github.com/icanzilb/JSONModel/blob/master/Changelog.md
此代码根据MIT授权协议的条款和条件进行分发。
注意!如果您正在修复您发现的错误,请添加单元测试,以便我知道在合并前如何准确地重现错误。