2018.11.14日更新
- 前言
- 沒想到這篇簡單介紹JSONModel的文章竟然已經(jīng)破了兩千閱讀量雹嗦,一躍成為我閱讀量最高的文章盘寡,作為iOS小白的我感到萬分惶恐
- 在這一個(gè)月的項(xiàng)目中令花,總是用到JSONModel掏父,此時(shí)從頭會看這篇文章兜叨,各種小錯(cuò)乃至嚴(yán)重的低級錯(cuò)誤不斷档玻,實(shí)在愧對我的讀者,在這里先道個(gè)歉躯畴。
- 今天正好有空民鼓,我把有問題的地方都修改一下,希望能對點(diǎn)進(jìn)來看的人有所幫助
- 更新內(nèi)容
- NSArray關(guān)鍵詞修改為copy
- 使用協(xié)議蓬抄,在最后使用的時(shí)候不用新建類丰嘉,而是可以直接使用方法調(diào)用
- 添加如果API中有ID,image等與原來自帶方法撞名的嚷缭,該如何修改類名
- 添加方法避免類中屬性比借口多
- githubDemo同樣更新了
使用API
參考的JSON數(shù)據(jù)(可能與你看到的不同)
{
"date": "20181020",
"stories": [
{
"title": "每周一吸 · 貍花貓",
"ga_prefix": "102013",
"images": [
"https://pic4.zhimg.com/v2-9ef6021d279be280f7d2ba0788e392a7.jpg"
],
"multipic": true,
"type": 0,
"id": 9698943
},
{
"images": [
"https://pic3.zhimg.com/v2-b752576f81b0a584bcf0e2ba96a07666.jpg"
],
"type": 0,
"id": 9698988,
"ga_prefix": "102012",
"title": "大誤 · 救救馬云"
},
{
"images": [
"https://pic2.zhimg.com/v2-8502d8246509a273ba97133e0064176d.jpg"
],
"type": 0,
"id": 9698610,
"ga_prefix": "102010",
"title": "藥瓶上的「肝腎功能不全者慎用」饮亏,到底想表達(dá)什么?"
},
{
"images": [
"https://pic4.zhimg.com/v2-352a7a8539dfd84227b22c8574f327b7.jpg"
],
"type": 0,
"id": 9698819,
"ga_prefix": "102009",
"title": "孩子你終于長大了峭状,2 歲正是學(xué)理財(cái)?shù)暮脮r(shí)候"
},
{
"images": [
"https://pic1.zhimg.com/v2-bad6709dfc4abe08b9cacf5c75c03d00.jpg"
],
"type": 0,
"id": 9698931,
"ga_prefix": "102008",
"title": "「生命之橋」上克滴,失落的人們選擇在這里結(jié)束生命"
},
{
"images": [
"https://pic4.zhimg.com/v2-1b3b1acab0c685beaa5428f33c7c6c03.jpg"
],
"type": 0,
"id": 9698898,
"ga_prefix": "102007",
"title": "作為電影導(dǎo)演 / 歌手,作品信息量這么大优床,我自己都不知道"
},
{
"images": [
"https://pic3.zhimg.com/v2-d7a69c5474650820fce977064458d35e.jpg"
],
"type": 0,
"id": 9699031,
"ga_prefix": "102007",
"title": "13 歲少女肢解同窗好友,也許我們都小看她了"
},
{
"images": [
"https://pic2.zhimg.com/v2-abe3c9ea2cdfe8051ea36154d30b4989.jpg"
],
"type": 0,
"id": 9698984,
"ga_prefix": "102006",
"title": "瞎扯 · 如何正確地吐槽"
}
],
"top_stories": [
{
"image": "https://pic4.zhimg.com/v2-9b704e39dc83ae7202fefc8d192e10f3.jpg",
"type": 0,
"id": 9699031,
"ga_prefix": "102007",
"title": "13 歲少女肢解同窗好友誓焦,也許我們都小看她了"
},
{
"image": "https://pic2.zhimg.com/v2-66f79486c79deb9d779f9af99e719091.jpg",
"type": 0,
"id": 9699060,
"ga_prefix": "101921",
"title": "影視圈驚變 2018"
},
{
"image": "https://pic4.zhimg.com/v2-e093102accf700073af6c3452293cd27.jpg",
"type": 0,
"id": 9698862,
"ga_prefix": "101719",
"title": "「56 個(gè)星座胆敞,56 支花」……等等,不是 56 個(gè)民族嗎杂伟?"
},
{
"image": "https://pic4.zhimg.com/v2-76f03b3ab26c3d76be022a5281a13483.jpg",
"type": 0,
"id": 9698744,
"ga_prefix": "101810",
"title": "花海淪陷在抖音網(wǎng)紅的臀下移层,想要提前避免,可能真沒什么轍"
},
{
"image": "https://pic3.zhimg.com/v2-5babbbaa37cccaf467b996e9bc1aadda.jpg",
"type": 0,
"id": 9698809,
"ga_prefix": "101807",
"title": "大學(xué)校園淪為艾滋病重災(zāi)區(qū)赫粥?一直如此观话,形勢也越來越嚴(yán)峻"
}
]
}
參考文章(閱讀順序排列, 對于基本的不再贅述)
補(bǔ)充說明如何將數(shù)據(jù)轉(zhuǎn)化
GitHub地址
易錯(cuò)點(diǎn)
- 可以看到我們要解析的這個(gè)JSON數(shù)據(jù)是相當(dāng)復(fù)雜的越平, 他有嵌套频蛔, 有數(shù)組, 需要一次解析秦叛, 在閱讀了上面的文章以后晦溪, 應(yīng)該對如何處理有了自己的看法, 我這里放一個(gè)我覺得比較好的的方法挣跋。
- 首先要說明一下三圆, JSONModel的作用說白了就是將JSON數(shù)據(jù)依照關(guān)鍵字,變成一個(gè)類的屬性, 方便使用舟肉, 它的強(qiáng)大之處在于能夠完成數(shù)據(jù)形式的轉(zhuǎn)換
- 那么我要說的是修噪, 在嵌套數(shù)據(jù)時(shí), 我們應(yīng)該對每一個(gè)要嵌套的都寫成一個(gè)類路媚,但并不是意味著要寫成多個(gè)類文件黄琼,而是只需要在一個(gè)類文件里把該有的寫好就行
//
// Top_storiesJSONModel.h
// JSONModel-exerciseDemo
//
// Created by mac on 2018/10/19.
// Copyright ? 2018 姜?jiǎng)P文. All rights reserved.
//
#import "JSONModel.h"
@protocol Top_storiesJSONModel
@end
@protocol StoriesJSONModel
@end
NS_ASSUME_NONNULL_BEGIN
@interface Top_storiesJSONModel : JSONModel
@property (nonatomic, copy) NSString *imageStr;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *ID;
@property (nonatomic, copy) NSString *ga_prefix;
@property (nonatomic, copy) NSString *title;
@end
@interface StoriesJSONModel : JSONModel
@property (nonatomic, copy) NSArray *images;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *id;
@property (nonatomic, copy) NSString *ga_prefix;
@property (nonatomic, copy) NSString *title;
@end
@interface TotalJSONModel : JSONModel
@property (nonatomic, copy) NSString *date;
@property (nonatomic, copy) NSArray<Top_storiesJSONModel>*top_stories;
@property (nonatomic, copy) NSArray<StoriesJSONModel>*stories;
@end
NS_ASSUME_NONNULL_END
//
// Top_storiesJSONModel.m
// JSONModel-exerciseDemo
//
// Created by mac on 2018/10/19.
// Copyright ? 2018 姜?jiǎng)P文. All rights reserved.
//
#import "Top_storiesJSONModel.h"
@implementation StoriesJSONModel
+(BOOL)propertyIsOptional:(NSString *)propertyName{
return YES;
}
@end
@implementation Top_storiesJSONModel
+(BOOL)propertyIsOptional:(NSString *)propertyName{
return YES;
}
+ (JSONKeyMapper *)keyMapper {
return [[JSONKeyMapper alloc] initWithModelToJSONDictionary:@{
@"ID":@"id",
@"imageStr":@"image"
}];
}
@end
@implementation TotalJSONModel
+(BOOL)propertyIsOptional:(NSString *)propertyName{
return YES;
}
@end
關(guān)鍵代碼說明
- NSLog(@"---test---%@----", [totalJSONModel.top_stories[0] imageStr]);//最后調(diào)用時(shí),最后一項(xiàng)不能直接使用點(diǎn)語法調(diào)用磷籍,需要使用get方法
+ (JSONKeyMapper *)keyMapper {
return [[JSONKeyMapper alloc] initWithModelToJSONDictionary:@{
@"ID":@"id",
@"imageStr":@"image"
}];
}
- 這一段換名字是為了避開id這個(gè)關(guān)鍵字适荣,以及image是OC的自帶方法,直接使用會導(dǎo)致失敗
+(BOOL)propertyIsOptional:(NSString *)propertyName{
return YES;
}
- 這句話使用院领,就算API中沒有請求到類中的弛矛,映射有問題也不會報(bào)錯(cuò)(直接忽略)