使用Mantle來Model化來自豆瓣的電影數(shù)據(jù)

Mantle的使用

要實(shí)現(xiàn)的功能

我要舉得例子來自豆瓣電影喜颁,根據(jù)某電影ID從豆瓣上把數(shù)據(jù)抓取出來,通過Mantle格式化為我們需要的Model坎吻。

豆瓣電影獲取到后是一串JSON,類似下面:

{
    "alt": "http://movie.douban.com/movie/4212172",
    "alt_title": "12生肖",
    "attrs": {
        "cast": [
            "成龍 Jackie Chan",
            "權(quán)相宇 Sang-woo Kwone",
            "廖凡 Fan Liao",
            "姚星彤 Xingtong Yao",
            "張藍(lán)心 Lanxin Zhang",
            "白露娜 Laura Weissbecker",
            "劉承俊 Sung-jun Yoo",
            "吳彥祖 Daniel Wu",
            "舒淇 Qi Shu",
            "李宗盛 Jonathan Lee",
            "陳柏霖 Bo-lin Chen",
            "盧惠光 Ken Lo",
            "淺野長(zhǎng)英",
            "白冰 Bing Bai",
            "林鵬 Peng Lin"
        ],
        "country": [
            "中國(guó)大陸",
            "香港"
        ],
        "director": [
            "成龍 Jackie Chan"
        ],
        "language": [
            "英語",
            "漢語普通話",
            "粵語",
            "法語",
            "西班牙語"
        ],
        "movie_duration": [
            "122分鐘"
        ],
        "movie_type": [
            "喜劇",
            "動(dòng)作",
            "冒險(xiǎn)"
        ],
        "pubdate": [
            "2012-12-12(香港國(guó)際電影節(jié))",
            "2012-12-20(中國(guó)大陸/香港)"
        ],
        "title": [
            "十二生肖"
        ],
        "website": [
            "hbpictures.ayomovie.com/12shengxiao"
        ],
        "writer": [
            "成龍 Jackie Chan",
            "唐季禮 Stanley Tong",
            "鄧景生 Edward Tang",
            "陳勛奇 Frankie Chan"
        ],
        "year": [
            "2012"
        ]
    },
    "author": [
        {
            "name": "成龍 Jackie Chan"
        }
    ],
    "id": "http://api.douban.com/movie/4212172",
    "image": "http://img3.douban.com/view/movie_poster_cover/ipst/public/p1826580562.jpg",
    "mobile_link": "http://m.douban.com/movie/subject/4212172/",
    "rating": {
        "average": "6.7",
        "max": 10,
        "min": 0,
        "numRaters": 159114
    },
    "summary": "當(dāng)年英法聯(lián)軍火燒圓明園,致使大批珍貴文物流落海外帜慢,其中四尊十二生肖獸首最引人關(guān)注,不僅惹出國(guó)內(nèi)外的廣泛爭(zhēng)論唯卖,更有收藏家開出天價(jià)競(jìng)拍這幾尊珍品粱玲。當(dāng)然,其間不乏奸邪的文物販子拜轨,試圖通過偷盜的手段獲取寶貝抽减。以此為契機(jī),正在度假的國(guó)際大盜JC(成龍 飾)隆重登場(chǎng)撩轰。JC背后有一支 Simon(權(quán)相宇 飾)胯甩、David(廖凡 飾)、Bonnie(張藍(lán)心 飾)等人共同組成的超專業(yè)團(tuán)隊(duì)堪嫂,他們一同遠(yuǎn)赴巴黎偎箫,尋求國(guó)寶鑒定專家Coco(姚星彤 飾)的幫助。經(jīng)過周密細(xì)致的準(zhǔn)備皆串,JC等人一步步逼近重兵把守的獸首淹办,而圍繞珍寶不可避免爆發(fā)連番驚險(xiǎn)火爆的打斗與追逐。
在這一過程中恶复,JC似曾被利益和金錢泯滅的愛國(guó)之心漸漸蘇醒……",
    "tags": [
        {
            "count": 34460,
            "name": "動(dòng)作"
        },
        {
            "count": 22094,
            "name": "喜劇"
        },
        {
            "count": 14424,
            "name": "香港"
        },
        {
            "count": 9839,
            "name": "冒險(xiǎn)"
        },
        {
            "count": 8222,
            "name": "2012"
        },
        {
            "count": 7660,
            "name": "搞笑"
        },
        {
            "count": 3214,
            "name": "3D"
        },
        {
            "count": 2524,
            "name": "中國(guó)大陸"
        }
    ],
    "title": "十二生肖"
}

這個(gè)JSON數(shù)據(jù)可以說是非常復(fù)雜的怜森,考慮到了各種情況。數(shù)值部分有整數(shù)谤牡、浮點(diǎn)數(shù)副硅、字符串。JSON里面還嵌套有多個(gè)Dictionary和Array翅萤。

我們要轉(zhuǎn)換的Model定義如下:

// MovieAttrs
@interface DBMovieAttrs: MTLModel<MTLJSONSerializing>

@property (nonatomic, strong) NSArray * cast;
@property (nonatomic, strong) NSArray * country;
@property (nonatomic, strong) NSArray * director;
@property (nonatomic, strong) NSArray * language;
@property (nonatomic, strong) NSArray * movieDuration;
@property (nonatomic, strong) NSArray * movieType;
@property (nonatomic, strong) NSArray * pubdate;
@property (nonatomic, strong) NSArray * title;
@property (nonatomic, strong) NSArray * website;
@property (nonatomic, strong) NSArray * writer;
@property (nonatomic, strong) NSArray * year;

@end

// MovieAuthor
@interface DBMovieAuthor: MTLModel<MTLJSONSerializing>

@property (nonatomic, strong) NSString * name;

@end

// MovieRating
@interface DBMovieRating: MTLModel<MTLJSONSerializing>

@property (nonatomic, strong) NSNumber * average;
@property (nonatomic, assign) NSInteger max;
@property (nonatomic, assign) NSInteger min;
@property (nonatomic, assign) NSInteger numRaters;

@end

// MovieTag
@interface DBMovieTag: MTLModel<MTLJSONSerializing>

@property (nonatomic, assign) NSInteger count;
@property (nonatomic, strong) NSString * name;

@end

// Main
@interface DBMovie: MTLModel<MTLJSONSerializing>

@property (nonatomic, strong) NSURL * alt;
@property (nonatomic, strong) NSString * altTitle;
@property (nonatomic, strong) NSString * movieID;
@property (nonatomic, strong) NSURL * imageURL;
@property (nonatomic, strong) NSURL * mobileLinkURL;
@property (nonatomic, strong) NSString * summary;
@property (nonatomic, strong) NSString * title;

// ==== MovieAttrs
@property (nonatomic, strong) DBMovieAttrs * attrs;
// ==== DBMovieAuthor
@property (nonatomic, strong) NSArray * authors;
// ==== MovieRating
@property (nonatomic, strong) DBMovieRating * rating;
// ==== MovieTag
@property (nonatomic, strong) NSArray * tags;



@end

觀察DBMovie中的imageURL屬性恐疲,是一個(gè)NSURL對(duì)象。這邊有點(diǎn)奇怪套么,JSON中是不包含特殊數(shù)據(jù)類型的啊培己。JSON里面確實(shí)沒有NSURL,但是我們實(shí)際使用的時(shí)候肯定是用NSURL胚泌,所以為了方便起見省咨,我們會(huì)在Model化的時(shí)候進(jìn)行一個(gè)轉(zhuǎn)換。而且玷室,通過Mantle這個(gè)強(qiáng)大的工具零蓉,我們可以很方便的進(jìn)行這個(gè)工作笤受。

MovieAttrsDBMovieAuthor敌蜂、MovieRating感论、MovieTag都是類對(duì)象,都是通過對(duì)二級(jí)JSON對(duì)象的轉(zhuǎn)換得到的紊册。轉(zhuǎn)換方法同NSURL類似比肄。

核心類

Mantle的核心類有3個(gè):

  • MTLModel
  • MTLJSONAdapter
  • MTLJSONSerializing

MTLModel

MTLModel是所有Model的父類,提供了一些默認(rèn)的行為來處理對(duì)象的初始化和歸檔操作囊陡,同時(shí)可以獲取到對(duì)象所有屬性的鍵值集合

MTLJSONAdapter

用于在MTLModel對(duì)象和JSON字典之間進(jìn)行相互轉(zhuǎn)換芳绩,相當(dāng)于是一個(gè)適配器

MTLJSONSerializing

需要與JSON字典進(jìn)行相互轉(zhuǎn)換的MTLModel的子類都需要實(shí)現(xiàn)該協(xié)議,以方便MTLJSONApadter對(duì)象進(jìn)行轉(zhuǎn)換

實(shí)現(xiàn)DBMovie

1 首先根據(jù)JSON數(shù)據(jù)定義寫好頭文件中的property.

@property (nonatomic, strong) NSURL * alt;
@property (nonatomic, strong) NSString * altTitle;
@property (nonatomic, strong) NSString * movieID;
@property (nonatomic, strong) NSURL * imageURL;
@property (nonatomic, strong) NSURL * mobileLinkURL;
@property (nonatomic, strong) NSString * summary;
@property (nonatomic, strong) NSString * title;

// ==== MovieAttrs
@property (nonatomic, strong) DBMovieAttrs * attrs;
// ==== DBMovieAuthor
@property (nonatomic, strong) NSArray * authors;
// ==== MovieRating
@property (nonatomic, strong) DBMovieRating * rating;
// ==== MovieTag
@property (nonatomic, strong) NSArray * tags;

2 寫好Model字段同JSON字段的映射

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{ @"alt"            : @"alt",
              @"altTitle"       : @"alt_title",
              @"movieID"        : @"id",
              @"imageURL"       : @"image",
              @"mobileLinkURL"  : @"mobile_link",
              @"summary"        : @"summary",
              @"title"          : @"title",
              @"attrs"          : @"attrs",
              @"authors"        : @"author",
              @"rating"         : @"rating",
              @"tags"           : @"tags",
              };
}

3 寫好特殊字段的處理方法回調(diào)函數(shù)
回調(diào)方法是根據(jù)特殊字段名稱來命名的撞反,例如imageURL這個(gè)字段妥色,它的函數(shù)名為:imageURLJSONTransformer

+ (NSValueTransformer *)imageURLJSONTransformer {
    return [MTLValueTransformer valueTransformerForName:MTLURLValueTransformerName];
}

上面的例子使用了內(nèi)置的轉(zhuǎn)換功能MTLURLValueTransformerName,實(shí)際上還有一個(gè)內(nèi)置的轉(zhuǎn)換功能MTLBooleanValueTransformerName遏片。

除此之外嘹害,如果你要轉(zhuǎn)換一個(gè)你自己寫的類,那么就應(yīng)該是用自定義轉(zhuǎn)換吮便,比如我們要轉(zhuǎn)換attrs笔呀,它在Model中被映射為DBMovieAttrs類型。

+ (NSValueTransformer *)attrsJSONTransformer {

    return [MTLValueTransformer transformerUsingForwardBlock:^id(id value, BOOL *success, NSError *__autoreleasing *error) {

        DBMovieAttrs * attrsModel = [MTLJSONAdapter modelOfClass:[DBMovieAttrs class] fromJSONDictionary:value error:nil];

        return attrsModel;
    }];
}

使用Mantle內(nèi)置的轉(zhuǎn)換函數(shù)+ (instancetype)transformerUsingForwardBlock:(MTLValueTransformerBlock)transformation

回調(diào)中的value是傳遞過來的值髓需,一般是一個(gè)Dictionary或者Array许师。返回一個(gè)對(duì)象,在這邊是DBMovieAttrs的對(duì)象

4 寫好JSON 中null值字段的處理方法回調(diào)
在JSON中僚匆,如果一個(gè)字段沒有值微渠,那么值是null,我們?cè)诔绦蛑行枰厥馓幚硭掷蓿疫\(yùn)的是Mantle已經(jīng)為我們考慮好了逞盆。你只需要添加一個(gè)處理回調(diào)函數(shù),即可萬無一失松申。

- (void)setNilValueForKey:(NSString *)key {
    [self setValue:@0 forKey:key];  // For NSInteger/CGFloat/BOOL
}

你可以根據(jù)key來設(shè)置不同的默認(rèn)值云芦。非常方便。

寫在后面

具體的實(shí)現(xiàn)代碼可以到這邊查看
https://github.com/irobbin1024/Mantle-DoubanMovie

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攻臀,一起剝皮案震驚了整個(gè)濱河市焕数,隨后出現(xiàn)的幾起案子纱昧,更是在濱河造成了極大的恐慌刨啸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件识脆,死亡現(xiàn)場(chǎng)離奇詭異设联,居然都是意外死亡善已,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門离例,熙熙樓的掌柜王于貴愁眉苦臉地迎上來换团,“玉大人,你說我怎么就攤上這事宫蛆∷野” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵耀盗,是天一觀的道長(zhǎng)想虎。 經(jīng)常有香客問我,道長(zhǎng)叛拷,這世上最難降的妖魔是什么舌厨? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮忿薇,結(jié)果婚禮上裙椭,老公的妹妹穿的比我還像新娘。我一直安慰自己署浩,他們只是感情好揉燃,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筋栋,像睡著了一般你雌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上二汛,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天婿崭,我揣著相機(jī)與錄音,去河邊找鬼肴颊。 笑死氓栈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婿着。 我是一名探鬼主播授瘦,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼竟宋!你這毒婦竟也來了提完?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤丘侠,失蹤者是張志新(化名)和其女友劉穎徒欣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜗字,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡打肝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年脂新,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粗梭。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡争便,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出断医,到底是詐尸還是另有隱情滞乙,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布鉴嗤,位于F島的核電站酷宵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏躬窜。R本人自食惡果不足惜浇垦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荣挨。 院中可真熱鬧男韧,春花似錦、人聲如沸默垄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽口锭。三九已至朦前,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹃操,已是汗流浹背韭寸。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荆隘,地道東北人恩伺。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像椰拒,于是被迫代替她去往敵國(guó)和親晶渠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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