JSONModel 是一個庫,他能智能並且快速的建立出資料 model,你可以在你的 iOS 項目或者 OSX 項目上使用它.
JSONModel使用方法
1*建立一個你自己的類,並繼承至 JSONModel
2.在你的標頭檔裡面進行聲明你所需要的 JSON key值
3* .m檔案中你不需要做其他的事情了.
接下來簡單介紹一下 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;
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];
JSONModel的處理複雜嵌套的問題 還是以上面的資料和介面舉例
聲明兩個model 這個嵌套資料都是這種模型的#import "JSONModel.h"@protocol AmbitusCityModel@end@interface AmbitusCityModel : JSONModel@property (nonatomic, assign) NSInteger city_id;@property (nonatomic, strong) NSString *city_name;@end#import "AmbitusCityModel.h"@implementation AmbitusCityModel@end// 第二個model#import "JSONModel.h"#import "AmbitusCityModel.h"@interface AmbitusCityTypeModel : JSONModel@property (nonatomic, strong) NSString *begin_key;@property (nonatomic, strong) NSMutableArray<AmbitusCityModel> *city_list;@end#import "AmbitusCityTypeModel.h"@implementation AmbitusCityTypeModel@end// 解析過程如下- (void)setUpData { NSString *urlString = [NSString stringWithFormat:@"%@",@"http://api.lanrenzhoumo.com/district/list/allcity?session_id=00004016b3e14bbea40c1aa1a14c2273a35352"]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString] cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30.0]; [request setHTTPMethod:@"GET"]; self.dataArray = [NSMutableArray array]; NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; self.dataArray = [NSMutableArray array]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"Httperror: %@%ld", error.localizedDescription, error.code); } else { if (data) { NSDictionary *tempDict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil]; self.dataArray = [TypeTwoModel arrayOfModelsFromDictionaries:[tempDict valueForKey:@"result"]]; dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); } } }]; [dataTask resume];}