JSONModel_下載git
快速的解析數據爲Model模型,支持層級嵌套Model模型解析,指定類型自動轉化,無需手動解析,一行代碼搞定!github
配合ESJsonFormat插件效果更佳!
ESJSONFormatter_下載objective-c
假設你的 JSON 串像下面這樣子:json
{ "id":"10", "country":"Germany", "dialCode": 49, "isInEurope":true }
建立一個你本身的類,並繼承至 JSONModel
在你的頭文件裏面進行聲明你所須要的 JSON key值api
#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 ,以下所示:app
#import "CountryModel.h" ... NSString* json = (fetch here JSON from Internet) ... NSError* err = nil; CountryModel* country = [[CountryModel alloc] initWithString:json error:&err];
若是傳過來的 JSON 合法,你所定義的全部的屬性都會與該 JSON 值相匹配,而且 JSONModel 也會嘗試儘量的轉換成你所想要的數據,就像上面的例子:dom
轉化 "id",從字符串轉換成 int 型post
拷貝 country 屬性的值fetch
轉換 dialCode ,從NSNumber 轉換爲 NSString 值
最後一個呢是將 isInEurope 轉換成 BOOL 的屬性
因此,你須要作的就是定義出你指望的屬性就好了。
<u>例子中全部Model模型都要繼承JSONModel</u>
Model屬性名和服務器返回數據字段一致
Model屬性名和服務器返回數據字段一致
關聯其餘Model的屬性須要指定自身類型(例如: <u>ProductModel*</u>)
注意:
NSArry後的就<>中包含一個協議,這並非Objective-C的新語法,他們不會衝突,使用JSONModel必須實現這個協議!
層級嵌套,Model中包含其餘Model集合,必須實現該協議!!!
@protocol 協議必須實現!!!(以下圖所示)
包含其餘Model集合的屬性須要指定層級類型和自身類型(例如: <u>NSArray<ProductModel>*</u>)
在一個Model中獲取服務器返回數據不一樣層級的數據
例如:order_id和name不在同一層級
採用KVC的方式來取值,並賦值給Model屬性(order_details.name ---> productName order_details.price.usd ---> price)
自定義把下劃線字段解析爲駝峯命名屬性
場景:服務器數據返回下劃線命名字段可爲Model中以駝峯命名的屬性相應的賦值
mapperFromUpperCaseToLowerCase 大寫轉小寫
某些屬性值能夠爲空
防止因爲服務器數據返回空致使JSONModel異常(程序崩潰)
解析時會徹底忽略它
場景: 該屬性值不須要從服務器數據中獲取
Model的全部屬性值均可覺得空
防止因爲服務器數據返回空致使JSONModel異常(程序崩潰)
官方建議儘可能避免使用該方法
//添加額外的頭 [[JSONHTTPClient requestHeaders] setValue:@"MySecret" forKey:@"AuthorizationToken"]; //設置GET,POST請求 [JSONHTTPClient postJSONFromURLWithString:@"http://mydomain.com/api" params:@{@"postParam1":@"value1"} completion:^(id json, JSONModelError *err) { //檢查錯誤,處理JSON }];
快速導出Model中全部屬性和屬性值
ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil]; pm.name = @"Changed Name"; //以字典形式導出 NSDictionary* dict = [pm toDictionary]; //以字符串形式導出 NSString* string = [pm toJSONString];
添加NSDate轉換:根據後臺返回時間戳格式進行相應處理
場景:內嵌轉換,不能知足需求,須要自定義
JSONModel支持類型:
@implementation JSONValueTransformer (CustomTransformer) //時間戳轉NSDate - (NSDate *)NSDateFromNSString:(NSString*)string { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:APIDateFormat]; return [formatter dateFromString:string]; } //NSDate轉時間戳 - (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 //處理本地化標識後給locale賦值 - (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
好的容錯能力
自定義數據鍵值匹配
自動比較以及判斷的特性