iOS中yy_model解析

JSON轉(zhuǎn)Model

id json —> dict —> Model

原理是用Runtime換取Model的屬性,生成映射表,然后objc_msgSend(…)調(diào)用setter方法賦值

你給我一個 Model 類,我會用 runtime 提供的各種函數(shù)來拿到你所有的屬性和對應(yīng)的get``set,判斷完相應(yīng)的類型以后,調(diào)用objc_msgSend(...)烟零。

// json轉(zhuǎn)模型
+ (instancetype)yy_modelWithJSON:(id)json;
 
// 模型轉(zhuǎn)字符串
- (NSString *)yy_modelToJSONString 
 
// 字典轉(zhuǎn)模型
+ (instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary ;
 
// 聲明數(shù)組宁炫、字典或者集合里的元素類型時要重寫
+ (nullable NSDictionary<NSString *, id> *)modelContainerPropertyGenericClass;
 
// 字典里的key值與模型的屬性值不一致要重復(fù) 需遵循<YYModel>
+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper;
//黑名單 需遵循<modelPropertyBlacklis>
+ (nullable NSArray<NSString *> *)modelPropertyBlacklist;
//白名單 需遵循<modelPropertyWhitelist>
+ (nullable NSArray<NSString *> *)modelPropertyWhitelist;

最常用的就是下邊三個龙亲,用法:

1.字典轉(zhuǎn)模型,這個很簡單不說了悍抑;

// JSON:
{
    "uid":123456,
    "name":"Harry",
    "created":"1965-07-31T00:00:00+0000"
}

// Model:
@interface User : NSObject
@property UInt64 uid;
@property NSString *name;
@property NSDate *created;
@end
@implementation User
@end

    
// 將 JSON (NSData,NSString,NSDictionary) 轉(zhuǎn)換為 Model:
User *user = [User yy_modelWithJSON:json];
    
// 將 Model 轉(zhuǎn)換為 JSON 對象:
NSDictionary *json = [user yy_modelToJSONObject];

2.聲明數(shù)組鳄炉、字典或者集合元素是要重寫:

+ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass {
    return @{
             @"result":ResultModel.class,
             };
}

3.字典里的key值與模型的屬性值不一致(這個經(jīng)常比如id等關(guān)鍵字)

Model 屬性名和 JSON 中的 Key 不相同
// JSON:
{
    "n":"Harry Pottery",
    "p": 256,
    "ext" : {
        "desc" : "A book written by J.K.Rowing."
    },
    "ID" : 100010
}

// Model:
@interface Book : NSObject
@property NSString *name;
@property NSInteger page;
@property NSString *desc;
@property NSString *bookID;
@end
@implementation Book
//返回一個 Dict,將 Model 屬性名對映射到 JSON 的 Key传趾。
+ (NSDictionary *)modelCustomPropertyMapper {
    return @{@"name" : @"n",
             @"page" : @"p",
             @"desc" : @"ext.desc",
             @"bookID" : @[@"id",@"ID",@"book_id"]};
}
@end
//如
+ (NSDictionary<NSString *,id> *)modelCustomPropertyMapper{
  
    return @{@"pid":@"id"};
}

4迎膜、容器類屬性

@class Shadow, Border, Attachment;

@interface Attributes
@property NSString *name;
@property NSArray *shadows; //Array<Shadow>
@property NSSet *borders; //Set<Border>
@property NSMutableDictionary *attachments; //Dict<NSString,Attachment>
@end

@implementation Attributes
// 返回容器類中的所需要存放的數(shù)據(jù)類型 (以 Class 或 Class Name 的形式)。
+ (NSDictionary *)modelContainerPropertyGenericClass {
    return @{@"shadows" : [Shadow class],
             @"borders" : Border.class,
             @"attachments" : @"Attachment" };
}
@end
6浆兰、黑名單與白名單
@interface User
@property NSString *name;
@property NSUInteger age;
@end
    
@implementation Attributes
// 如果實現(xiàn)了該方法磕仅,則處理過程中會忽略該列表內(nèi)的所有屬性
+ (NSArray *)modelPropertyBlacklist {
    return @[@"test1", @"test2"];
}
// 如果實現(xiàn)了該方法珊豹,則處理過程中不會處理該列表外的屬性。
+ (NSArray *)modelPropertyWhitelist {
    return @[@"name"];
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榕订,一起剝皮案震驚了整個濱河市店茶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劫恒,老刑警劉巖贩幻,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異两嘴,居然都是意外死亡丛楚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門憔辫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趣些,“玉大人,你說我怎么就攤上這事贰您』灯剑” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵锦亦,是天一觀的道長舶替。 經(jīng)常有香客問我,道長杠园,這世上最難降的妖魔是什么顾瞪? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮返劲,結(jié)果婚禮上玲昧,老公的妹妹穿的比我還像新娘。我一直安慰自己篮绿,他們只是感情好孵延,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪森渐。 梳的紋絲不亂的頭發(fā)上懒棉,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛玷犹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洒疚,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歹颓,長吁一口氣:“原來是場噩夢啊……” “哼坯屿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巍扛,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤领跛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撤奸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吠昭,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年胧瓜,在試婚紗的時候發(fā)現(xiàn)自己被綠了矢棚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡府喳,死狀恐怖幻妓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情劫拢,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布强胰,位于F島的核電站舱沧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏偶洋。R本人自食惡果不足惜熟吏,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玄窝。 院中可真熱鬧牵寺,春花似錦、人聲如沸恩脂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俩块。三九已至黎休,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玉凯,已是汗流浹背势腮。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漫仆,地道東北人捎拯。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像盲厌,于是被迫代替她去往敵國和親署照。 傳聞我的和親對象是個殘疾皇子祸泪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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