JSONModel的使用

coverImage.jpg

1. 命名自動匹配

a. Model屬性名和服務(wù)器返回數(shù)據(jù)字段一致

{
    @"id":"123",
    @"name":"巧克力",
    @"price":"6.66"
}

  @interface ProductModel : BaseModel
  @property (nonatomic, strong) NSString *id;
  @property (nonatomic, strong) NSString *name;
  @property (nonatomic, assign) float     price;

  @end

2. Model關(guān)聯(lián)(model含有其它model)

a. Model屬性名和服務(wù)器返回數(shù)據(jù)一致;
b. 關(guān)聯(lián)其它Model的屬性需要指定自身類型(例如:ProductModel *)

  {
      “order_id”:104,
      “total_price”:110,
      “product”: {
           “id”:”123”,
           “name”:”productName”,
           “price”:”110”,
      }
  }

  @interface OrderModel : BaseModel
  @property (nonatomic, strong) NSString     *order_id;
  @property (nonatomic, assign) float        total_price;
  @property (nonatomic, strong) ProductModel *product;

  @end

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

a. NSArry后的就<>中包含一個協(xié)議,使用JSONModel必須實現(xiàn)這個協(xié)議!
b. 層級嵌套瓢棒,Model中包含其他Model集合,必須實現(xiàn)該協(xié)議
c. 包含其他Model集合的屬性需要指定層級類型和自身類型(例如:NSArray<ProductModel> *)

 @protocol ProductModel
 @end
 @interface OrderModel : JSONModel
 @property (nonatomic, strong) NSString *order_id;
 @property (nonatomic, assign) float     total_price;
 @property (nonatomic, strong) NSArray<ProductModel> *products;

 @end

4. 鍵映射

a. 在一個Model中獲取服務(wù)器返回數(shù)據(jù)不同層級的數(shù)據(jù);
b. 例如:order_id和name不在同一層級;
c. 采用KVC的方式來取值,并賦值給Model屬性(order_details.name ---> productName order_details.price.usd ---> price);

 {
   "order_id": 104,
   "order_details" : [
     {
       "name": "name_#1",
       "price": {
         "usd": 12.95
       }
     }
   ]
 }

@interface OrderModel : BaseModel
@property (nonatomic, strong) NSString *id;
@property (nonatomic, assign) float    price;
@property (nonatomic, strong) NSString *productName;
@end
@implementation OrderModel
+ (JSONKeyMapper *)keyMapper 
{
    return [[JSONKeyMapper alloc] initWithDictionary:@{
                                        @"order_id": @"id",
@"order_details.name": @"productName",                                                                  @"order_details.price.usd": @"price"}];
}

@end

d.全局Global key mapping. (使所有的模型都具備)

JSONKeyMapper *keyMapper = [[JSONKeyMapper alloc] initWithDictionary:@{@"id":@"modelId"}];
[BaseModel setGlobalKeyMapper:keyMapper];

5. 設(shè)置下劃線自動轉(zhuǎn)駝峰

a. 自定義把下劃線字段解析為駝峰命名屬性
b. 場景:服務(wù)器數(shù)據(jù)返回下劃線命名字段可為Model中以駝峰命名的屬性相應(yīng)的賦值
c. mapperFromUpperCaseToLowerCase 大寫轉(zhuǎn)小寫

 {
   "order_id": 104,
   "order_product" : @"Product#1",
   "order_price" : 12.95
 }

@interface OrderModel : BaseModel
@property (nonatomic, strong) NSString *orderId;
@property (nonatomic, assign) float     orderPrice;
@property (nonatomic, strong) NSString *orderProduct;

@end

@implementation OrderModel
+ (JSONKeyMapper *)keyMapper
{
    return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
}

@end

6. 可選屬性(屬性值可以為空或null)

a. 某些屬性值可以為空;
b. 防止由于服務(wù)器返回數(shù)據(jù)為空導(dǎo)致JSONModel異常(程序崩潰)脓杉;

eg: @property (nonatomic, strong) NSString<Optional> *urlString;

7. 忽略屬性(屬性值可以完全忽略)

a. 解析時完全忽略它;
b. 場景:該屬性不需要從服務(wù)器數(shù)據(jù)中獲取旦签;

 eg: @property (nonatomic, strong) NSString<Ignore> *urlString;

8. 設(shè)置所有屬性可選(所有屬性值可以為空)

a. Model 的所有屬性值可以為空破托;
b. 防止由于服務(wù)器數(shù)據(jù)返回空導(dǎo)致JSONModel異常(程序崩潰)肪跋;
c. 官方建議盡量避免使用該方法(即使要全部屬性為可選,也盡量是在每個屬性那里標注為Optional)土砂;

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

9. 將Model導(dǎo)出字典或JSON字符串

a. 快速導(dǎo)出Model中所有屬性和屬性值州既;

 eg:
 HomeHotModel *model = [[HomeHotModel alloc] initWithString:jsonString  error:nil];
 //以字典形式導(dǎo)出
 NSDictionary *dict = [model toDictionary];
 //以字符串形式導(dǎo)出
 NSString *string = [model toJSONString];

10. 自定義數(shù)據(jù)處理(JSON數(shù)據(jù)格式:string, number, array, object, 以及null)

a. 添加NSDate轉(zhuǎn)換:根據(jù)后臺返回時間戳格式進行相應(yīng)處理(eg:UIColor);
b. 場景:內(nèi)嵌轉(zhuǎn)換,不能滿足需求,需要自定義萝映;
c. JSONModel支持類型如下圖:

JSONModel支持類型.png
eg:
#import "JSONValueTransformer+CustomTransformer.h"
@implementation JSONValueTransformer (CustomTransformer)
//時間戳轉(zhuǎn)NSDate
- (NSDate *)NSDateFromNSString:(NSString *)string
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    NSDate *date = [formatter dateFromString:string];
    return date;
}

//NSDate轉(zhuǎn)時間戳
- (NSString *)JSONObjectFromNSDate:(NSDate *)date
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    NSString *dateStr = [formatter stringFromDate:date];
    return dateStr;
}

@end

11. 延遲加載吴叶, 這種比較推薦,可以減少在網(wǎng)絡(luò)讀取時的性能消耗,關(guān)鍵字為: ConvertOnDemand

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

//產(chǎn)品Model
@interface ProductModel : JSONModel
@property (nonatomic, strong) NSString *id;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) float     price;
@end

//訂單Model
@interface OrderModel : JSONModel
@property (nonatomic, strong) NSString *order_id;
@property (nonatomic, assign) float    total_price;
@property (nonatomic, strong) NSArray<ProductModel, ConvertOnDemand> *products;
@end

12. 模型的批處理序臂,即一次可以處理一批模型

NSArray *models = [OrderModel arrayOfObjectsFromDictionaries:jsonDatas error:nil];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚌卤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奥秆,更是在濱河造成了極大的恐慌逊彭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吭练,死亡現(xiàn)場離奇詭異诫龙,居然都是意外死亡,警方通過查閱死者的電腦和手機鲫咽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門签赃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人分尸,你說我怎么就攤上這事锦聊。” “怎么了箩绍?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵孔庭,是天一觀的道長。 經(jīng)常有香客問我,道長圆到,這世上最難降的妖魔是什么怎抛? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮芽淡,結(jié)果婚禮上马绝,老公的妹妹穿的比我還像新娘。我一直安慰自己挣菲,他們只是感情好富稻,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著白胀,像睡著了一般椭赋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上或杠,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天哪怔,我揣著相機與錄音,去河邊找鬼廷痘。 笑死蔓涧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的笋额。 我是一名探鬼主播元暴,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兄猩!你這毒婦竟也來了茉盏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤枢冤,失蹤者是張志新(化名)和其女友劉穎鸠姨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淹真,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡讶迁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了核蘸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巍糯。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖客扎,靈堂內(nèi)的尸體忽然破棺而出祟峦,到底是詐尸還是另有隱情,我是刑警寧澤徙鱼,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布宅楞,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厌衙。R本人自食惡果不足惜距淫,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迅箩。 院中可真熱鬧溉愁,春花似錦、人聲如沸饲趋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奕塑。三九已至,卻和暖如春家肯,著一層夾襖步出監(jiān)牢的瞬間龄砰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工讨衣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留换棚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓反镇,卻偏偏與公主長得像固蚤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歹茶,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容