iOS面試問題:JSON轉(zhuǎn)化中異常處理

最近被問到iOS中JSON轉(zhuǎn)Object的過程中如果服務(wù)端給的JSON是不全的該如何處理雳灵,會不會造成崩潰棕所?
經(jīng)過我的測試,是不會造成崩潰的悯辙,只是結(jié)果為nil琳省,但是在object --> JSON的過程中發(fā)生錯誤的話,系統(tǒng)是會拋出異常躲撰,也就是崩潰的针贬。下面可以仔細(xì)看一下iOS提供的API。

JSON --> Object

    BOOL isFool = YES;
    NSString *json = @"{\"users\":[\"Jack\",\"Pinkman\"]}";
    if (isFool) {
        json = @"{\":[\"Jack\",\"Pinkman\"]}";
    }
    // json --> dict
    NSData *j_data = [json dataUsingEncoding:NSUTF8StringEncoding];
    NSError *j_err = nil;
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:j_data options:NSJSONReadingMutableContainers error:&j_err];
    if (dict && !j_err) {
        NSLog(@"success %@",dict);
    } else {
        /*
         json --> dict的過程中產(chǎn)生錯誤并不會崩潰
         */
        NSLog(@"fail %@",j_err);
    }

轉(zhuǎn)換關(guān)鍵的是[NSJSONSerialization JSONObjectWithData:options:error:]拢蛋,看一下Apple給的注釋

Create a Foundation object from JSON data. If an error occurs during the parse, then the error parameter will be set and the result will be nil.
--翻譯--
根據(jù)JSON data創(chuàng)建一個Foundation Object桦他。如果在轉(zhuǎn)化的過程中發(fā)生了錯誤,結(jié)果為nil谆棱,error將會被賦值文狱。
(省略掉了一些關(guān)于options參數(shù)的解釋坟募,整個注釋中并沒有提到會拋出異常)

所以結(jié)論是即使后端返回的JSON數(shù)據(jù)是異常的直秆,iOS客戶端在轉(zhuǎn)化的過程中并不會崩潰,也無需做特殊處理坪郭。

Object --> JSON

先看Apple提供API的注釋

Generate JSON data from a Foundation object. If the object will not produce valid JSON then an exception will be thrown.  If an error occurs, the error parameter will be set and the return value will be nil. 
--翻譯--
根據(jù)一個Foundation object生成JSON data。如果object不是符合規(guī)范的JSON歪沃,異常將會被拋出绸罗。如果發(fā)生了異常,結(jié)果為nil育灸,error會被賦值昵宇。
(Apple提示了這個過程中如果發(fā)生錯誤是會拋出異常崩潰的)

那么該如何規(guī)避這種崩潰呢砸喻?NSJSONSerialization中提供了+(BOOL)isValidJSONObject:用來檢測object是否能被轉(zhuǎn)成JSON割岛,只要先用這個判斷就可以了,代碼如下:

    // 一個自定義的類惠爽,自己寫一下就行
    BreakingBad *white = [[BreakingBad alloc] init];
    white.name = @"White";
    NSDictionary *origDict = @{
        @"users":@[@"Jessy",@"Pinkman"],
        @"guity":[NSNull null],
        @"object":white,
    };
    BOOL isValid = [NSJSONSerialization isValidJSONObject:origDict];
    if (isValid) {
        NSError *o_err = nil;
        NSData *o_data = [NSJSONSerialization dataWithJSONObject:origDict options:NSJSONWritingFragmentsAllowed error:&o_err];
        if (o_data && !o_err) {
            NSString *str = [[NSString alloc] initWithData:o_data encoding:NSUTF8StringEncoding];
            NSLog(@"obj --> json success %@",str);
        } else {
            NSLog(@"obj --> json fail %@",o_err);
        }
    } else {
        NSLog(@"obj --> json fail, obj is not valid");
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旬痹,一起剝皮案震驚了整個濱河市两残,隨后出現(xiàn)的幾起案子沼死,更是在濱河造成了極大的恐慌意蛀,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痒留,居然都是意外死亡匾效,警方通過查閱死者的電腦和手機(jī)面哼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仿粹,“玉大人吭历,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遣总。 經(jīng)常有香客問我容达,道長花盐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮诈嘿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘析砸。我一直安慰自己作郭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布压语。 她就那樣靜靜地躺著,像睡著了一般斥季。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躁锡,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音蜡坊,去河邊找鬼杠输。 笑死,一個胖子當(dāng)著我的面吹牛秕衙,可吹牛的內(nèi)容都是我干的蠢甲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼据忘,長吁一口氣:“原來是場噩夢啊……” “哼鹦牛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勇吊,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎近忙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體为狸,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逼蒙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荷并。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谈息。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡胳挎,死狀恐怖炊林,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忘晤,我是刑警寧澤竞思,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布距辆,位于F島的核電站爆土,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倔矾。R本人自食惡果不足惜匹层,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一譬胎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧命锄,春花似錦堰乔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驶冒,卻和暖如春苟翻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背只怎。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工袜瞬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人身堡。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓邓尤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贴谎。 傳聞我的和親對象是個殘疾皇子汞扎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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

  • 1.請簡單說明多線程技術(shù)的優(yōu)點(diǎn)和缺點(diǎn)? 優(yōu)點(diǎn):能夠適當(dāng)提高程序的執(zhí)行效率擅这;能夠適當(dāng)?shù)奶岣哔Y源的利用率澈魄,比如CPU、...
    deeper_iOS閱讀 1,436評論 1 12
  • 發(fā)現(xiàn)自己有很多文檔仲翎,所以現(xiàn)在整理一下痹扇,以防忘了。溯香。鲫构。 作為一種輕量級的數(shù)據(jù)交換格式,json正在逐步取代xml玫坛,成...
    濼莫繁華閱讀 1,548評論 0 1
  • 1.請簡單說明多線程技術(shù)的優(yōu)點(diǎn)和缺點(diǎn)结笨? 優(yōu)點(diǎn):1.能夠適當(dāng)提高程序的執(zhí)行效率;2.能夠適當(dāng)?shù)奶岣哔Y源的利用率,比如...
    Jorunk閱讀 409評論 0 0
  • 未完炕吸,待更新 一伐憾、必備題 1、AFN 原理 鏈接:AFNetworking源碼——基本架構(gòu) - 簡書 2赫模、SDWe...
    小熊_07cb閱讀 2,771評論 3 27
  • JSON JSON和XML都是需要解析的 JSON是一種輕量級的數(shù)據(jù)格式树肃,一般用于數(shù)據(jù)交互服務(wù)器返回給客戶端的數(shù)據(jù)...
    JonesCxy閱讀 1,859評論 2 10