神奇的数据建模框架JSONModel(一)

JSONModel是一个库,让你快速创建智能数据模型。您可以在iOS和OSX应用程序使用它。

JSONModel自动内部检查你的模型类和你的JSON投入的结构,大大降低了代码,你必须编写量。

 

 

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

 

 

 

 添加JSONModel到您的项目

要求

  • ARC; 的iOS 5.0+ / OSX 10.7+
  • SystemConfiguration.framework

得到它为:

1)源文件

  1. 下载JSONModel库   zip文件或复制它
  2. 把JSONModel子文件夹复制到您的Xcode项目

2)通过pods

 

在项目的文件夹,使用终端输入下面的命令:

 
pod 'JSONModel'

源代码文档

源代码包含类的文档,你可以建立自己和导入Xcode中:

  1. 如果您还没有安装开发文档,那么就自己导入吧。
  2. 安装文件到Xcode的开发文档目录在库的根目录下。
  3. 重新启动的Xcode。

 基本用法

     如果你有一个这样的JSON数据:

 
{"id":"10", "country":"Germany", "dialCode": 49, "isInEurope":true}
  • 为您的数据模型,创建一个新的Objective-C类,并使其继承JSONModel类。
  • 与JSON键的名称你的头文件中声明的属性:
 
#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也将尝试上述它将尽可能多的数据转换为您所期望的类型,在这个例子:

  • 从字符串“ID”(在JSON中)转换为int的类
  • 只是复制country的价值
  • 转换数字dialCode(在JSON中)以一个NSString值
  • 最终转换isInEurope为BOOL为您BOOL财产

而好消息是,你所要做的就是定义属性及其预期的类型。


在线教程

官方网站:http://www.jsonmodel.com

类文档在线:http://jsonmodel.com/docs/

 

下面是例子  

AUTOMATIC NAME BASED MAPPING

{
  "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

MODEL CASCADING (MODELS INCLUDING OTHER MODELS)

{
  "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

MODEL COLLECTIONS

{
  "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

KEY MAPPING

{
  "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

GLOBAL KEY MAPPING (APPLIES TO ALL MODELS IN YOUR APP)

[JSONModel setGlobalKeyMapper:[
    [JSONKeyMapper alloc] initWithDictionary:@{
      @"item_id":@"ID",
      @"item.name": @"itemName"
   }]
];

MAP AUTOMATICALLY UNDER_SCORE CASE TO CAMELCASE

{
  "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

OPTIONAL PROPERTIES (I.E. CAN BE MISSING OR 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

IGNORED PROPERTIES (I.E. JSONMODEL COMPLETELY IGNORES THEM)

{
  "id": "123",
  "name": null
}
@interface ProductModel : JSONModel
@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString<Ignore>* customProperty;
@end

@implementation ProductModel
@end

MAKE ALL MODEL PROPERTIES OPTIONAL (AVOID IF POSSIBLE)

@implementation ProductModel
+(BOOL)propertyIsOptional:(NSString*)propertyName
{
  return YES;
}
@end

LAZY CONVERT COLLECTION ITEMS FROM DICTIONARIES TO MODELS

{
  "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

USING THE BUILT-IN THIN HTTP CLIENT

//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 ...

                               }];

EXPORT MODEL TO NSDICTIONARY OR TO JSON TEXT

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];

CUSTOM DATA TRANSFORMERS

@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

JSON验证 错误处理 自定义数据验证 自动比较和平等的功能

Misc

Author: Marin Todorov

Contributors: Christian Hoffmann, Mark Joslin, Julien Vignali, Symvaro GmbH, BB9z. Also everyone who did successful pull requests.

Change log : https://github.com/icanzilb/JSONModel/blob/master/Changelog.md


LICENSE

This code is distributed under the terms and conditions of the MIT license.


CONTRIBUTION GUIDELINES

NB! If you are fixing a bug you discovered, please add also a unit test so I know how exactly to reproduce the bug before merging.

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值