JSONModel使用「數據轉模型」

1、準備

JSONModel_下載git

JSONModel

快速的解析數據爲Model模型,支持層級嵌套Model模型解析,指定類型自動轉化,無需手動解析,一行代碼搞定!github

配合ESJsonFormat插件效果更佳!
ESJSONFormatter_下載objective-c

配合ESJsonFormat效果更佳

2、基本使用


假設你的 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 的屬性

因此,你須要作的就是定義出你指望的屬性就好了。

3、例子


<u>例子中全部Model模型都要繼承JSONModel</u>

1.命名自動匹配

  • Model屬性名和服務器返回數據字段一致

命名自動匹配

2.Model關聯(model含有其餘model)

  • Model屬性名和服務器返回數據字段一致

  • 關聯其餘Model的屬性須要指定自身類型(例如:  <u>ProductModel*</u>)

Model關聯

3.Model集合(model含有其餘model的集合)

注意:

NSArry後的就<>中包含一個協議,這並非Objective-C的新語法,他們不會衝突,使用JSONModel必須實現這個協議!

  • 層級嵌套,Model中包含其餘Model集合,必須實現該協議!!!
  • @protocol 協議必須實現!!!(以下圖所示)
  • 包含其餘Model集合的屬性須要指定層級類型和自身類型(例如:  <u>NSArray<ProductModel>*</u>)

Model集合

4.鍵映射

  • 在一個Model中獲取服務器返回數據不一樣層級的數據

  • 例如:order_id和name不在同一層級

  • 採用KVC的方式來取值,並賦值給Model屬性(order_details.name ---> productName  order_details.price.usd ---> price)

鍵映射

5.設置全局鍵映射(應用於全部model)

全局鍵映射

6.設置下劃線自動轉駝峯

  • 自定義把下劃線字段解析爲駝峯命名屬性

  • 場景:服務器數據返回下劃線命名字段可爲Model中以駝峯命名的屬性相應的賦值

  • mapperFromUpperCaseToLowerCase 大寫轉小寫

下劃線自動轉駝峯

7.可選屬性(屬性值能夠爲空或null)

  • 某些屬性值能夠爲空

  • 防止因爲服務器數據返回空致使JSONModel異常(程序崩潰)

可選屬性

8.忽略屬性(屬性值能夠徹底忽略)

  • 解析時會徹底忽略它

  • 場景: 該屬性值不須要從服務器數據中獲取

忽略屬性

9.設置全部屬性可選(全部屬性值能夠爲空) 

  • Model的全部屬性值均可覺得空

  • 防止因爲服務器數據返回空致使JSONModel異常(程序崩潰)

  • 官方建議儘可能避免使用該方法

全部屬性可選

10.使用內置的HTTP連接

//添加額外的頭
[[JSONHTTPClient requestHeaders] setValue:@"MySecret" forKey:@"AuthorizationToken"];

//設置GET,POST請求
[JSONHTTPClient postJSONFromURLWithString:@"http://mydomain.com/api"
                                   params:@{@"postParam1":@"value1"}
                               completion:^(id json, JSONModelError *err) {
                                   //檢查錯誤,處理JSON
}];

11.將Model導出字典或JOSN字符串

  • 快速導出Model中全部屬性和屬性值

ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil];
pm.name = @"Changed Name";

//以字典形式導出
NSDictionary* dict = [pm toDictionary];

//以字符串形式導出
NSString* string = [pm toJSONString];

12.自定義數據處理

  • 添加NSDate轉換:根據後臺返回時間戳格式進行相應處理

  • 場景:內嵌轉換,不能知足需求,須要自定義

  • JSONModel支持類型:

json支持類型

@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

13.自定義處理特殊屬性

@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

14.自定義JSON驗證

@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
  • 好的容錯能力

  • 自定義數據鍵值匹配

  • 自動比較以及判斷的特性

相關文章
相關標籤/搜索