https://github.com/jsonmodel/jsonmodeljavascript
若是你喜歡JSONModel,而且使用了它,請你:java
star一下git
給我一些反饋. 多謝!github
JSONModel 是一個可以快速巧妙的建立數據模型的庫. 你能夠在 iOS or OSX APP中使用它.json
JSONModel 自動檢查JOSN模型和結構體, 完全的減小你的代碼量.api
1.下載JSONModel.zip文件
2.將它拷貝到你的項目中
3.導入SystemConfiguration.framework框架ruby
pod 'JSONModel'
若是你想關於CocoaPods瞭解更多,請參考這個簡單的教程.bash
在你的項目的Cartfile添加JSONModel:app
github "jsonmodel/jsonmodel"
你能夠查看在線閱讀文檔: http://cocoadocs.org/docsets/JSONModel框架
涉想你的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://www.jsonmodel.com
在線文檔: 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
注意: 尖括號後 <code>NSArray</code> 包含一個協議. 這跟Objective-C原生的泛型不是一個概念. 他們不會衝突, 但對於JSONModel來講,協議必須在一個地方聲明.
{
"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
//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];
@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
@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