iOS開發(fā)-JSON解析

一、 JSON解析

  • 1.1 JSON簡單介紹

    001 問:什么是JSON
    答:
    (1)JSON是一種輕量級的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互
    (2)服務(wù)器返回給客戶端的數(shù)據(jù)们颜,一般都是JSON格式或者XML格式(文件下載除外)
    002 相關(guān)說明
    (1)JSON的格式很像OC中的字典和數(shù)組
    (2)標(biāo)準(zhǔn)JSON格式key必須是雙引號
    003 JSON解析方案
    a.第三方框架 JSONKit\SBJSON\TouchJSON
    b.蘋果原生(NSJSONSerialization)

  • 1.2 JSON解析相關(guān)代碼

(1)json數(shù)據(jù)->OC對象

//把json數(shù)據(jù)轉(zhuǎn)換為OC對象
-(void)jsonToOC
{
    //1. 確定url路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=33&pwd=33&type=JSON"];

    //2.創(chuàng)建一個請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.使用NSURLConnection發(fā)送一個異步請求
    [NSURLConnection sendAsynchronousRequest:request 
                     queue:[NSOperationQueue mainQueue] 
                     completionHandler:^(NSURLResponse * _Nullable response, 
                                         NSData * _Nullable data, 
                                         NSError * _Nullable connectionError) {

        //4.當(dāng)接收到服務(wù)器響應(yīng)的數(shù)據(jù)后,解析數(shù)據(jù)(JSON--->OC)

        /*
         第一個參數(shù):要解析的JSON數(shù)據(jù),是NSData類型也就是二進制數(shù)據(jù)
         第二個參數(shù): 解析JSON的可選配置參數(shù)
         NSJSONReadingMutableContainers 解析出來的字典和數(shù)組是可變的
         NSJSONReadingMutableLeaves 解析出來的對象中的字符串是可變的  iOS7以后有問題
         NSJSONReadingAllowFragments 被解析的JSON數(shù)據(jù)如果既不是字典也不是數(shù)組, 那么就必須使用這個
         */
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        NSLog(@"%@",dict);

    }];
}

(2)OC對象->JSON對象

 //1.要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象*這里是一個字典
    NSDictionary *dictM = @{
                            @"name":@"哈哈",
                            @"age":@100,
                            @"height":@1.72
                            };
    //2.OC->JSON
    /*
     注意:可以通過+ (BOOL)isValidJSONObject:(id)obj;方法判斷當(dāng)前OC對象能否轉(zhuǎn)換為JSON數(shù)據(jù)
     具體限制:
         1.obj 是NSArray 或 NSDictionay 以及他們派生出來的子類
         2.obj 包含的所有對象是NSString,NSNumber,NSArray,NSDictionary 或NSNull
         3.字典中所有的key必須是NSString類型的
         4.NSNumber的對象不能是NaN或無窮大
     */
    /*
     第一個參數(shù):要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象拯啦,這里為一個字典
     第二個參數(shù):NSJSONWritingPrettyPrinted對轉(zhuǎn)換之后的JSON對象進行排版,無意義
     */
    NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];

    //3.打印查看Data是否有值
    /*
     第一個參數(shù):要轉(zhuǎn)換為STring的二進制數(shù)據(jù)
     第二個參數(shù):編碼方式熔任,通常采用NSUTF8StringEncoding
     */
    NSString *strM = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",strM);

(3)OC對象和JSON數(shù)據(jù)格式之間的一一對應(yīng)關(guān)系

//OC對象和JSON數(shù)據(jù)之間的一一對應(yīng)關(guān)系
-(void)oCWithJSON
{
    //JSON的各種數(shù)據(jù)格式
    //NSString *test = @"\"哈哈\"";
    //NSString *test = @"true";
    NSString *test = @"{\"name\":\"哈哈\"}";

    //把JSON數(shù)據(jù)->OC對象,以便查看他們之間的一一對應(yīng)關(guān)系
    //注意點:如何被解析的JSON數(shù)據(jù)如果既不是字典也不是數(shù)組(比如是NSString), 那么就必須使用這NSJSONReadingAllowFragments
    NSData *data = [test dataUsingEncoding:NSUTF8StringEncoding]
    id obj = [NSJSONSerialization JSONObjectWithData: data options:NSJSONReadingAllowFragments error:nil];

    NSLog(@"%@", [obj class]);


    /* JSON數(shù)據(jù)格式和OC對象的一一對應(yīng)關(guān)系
         {} -> 字典
         [] -> 數(shù)組
         "" -> 字符串
         10/10.1 -> NSNumber
         true/false -> NSNumber
         null -> NSNull
     */
}
}

(4)如何查看復(fù)雜的JSON數(shù)據(jù)

方法一:
    在線格式化http://tool.oschina.net/codeformat/json
方法二:
    把解析后的數(shù)據(jù)寫plist文件褒链,通過plist文件可以直觀的查看JSON的層次結(jié)構(gòu)。
    [dictM writeToFile:@"/Users/abc/Desktop/videos.plist" atomically:YES];

(5)視頻的簡單播放

    //0.需要導(dǎo)入系統(tǒng)框架
    #import <MediaPlayer/MediaPlayer.h>

    //1.拿到該cell對應(yīng)的數(shù)據(jù)字典
    
    Video *video = self.videos[indexPath.row];

    NSString *videoStr = [@"http://120.25.226.186:32812" stringByAppendingPathComponent:video.url];

    //2.創(chuàng)建一個視頻播放器
    MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL URLWithString:videoStr]];
    //3.present播放控制器

    [self presentViewController:vc animated:YES completion:nil];
  • 1.3 字典轉(zhuǎn)模型框架

(1)相關(guān)框架

 a.Mantle 需要繼承自MTModel
 b.JSONModel 需要繼承自JSONModel
 c.MJExtension 不需要繼承疑苔,無代碼侵入性

(2)自己設(shè)計和選擇框架時需要注意的問題

a.侵入性
b.易用性甫匹,是否容易上手
c.擴展性,很容易給這個框架增加新的功能

(3)MJExtension框架的簡單使用

//1.把字典數(shù)組轉(zhuǎn)換為模型數(shù)組
    //使用MJExtension框架進行字典轉(zhuǎn)模型
        self.videos = [Video objectArrayWithKeyValuesArray:videoArray];

//2.重命名模型屬性的名稱
//第一種重命名屬性名稱的方法惦费,有一定的代碼侵入性
//設(shè)置字典中的id被模型中的ID替換
+(NSDictionary *)replacedKeyFromPropertyName
{
    return @{
             @"ID":@"id"
             };
}

//第二種重命名屬性名稱的方法兵迅,代碼侵入性為零
    [Video setupReplacedKeyFromPropertyName:^NSDictionary *{
        return @{
                 @"ID":@"id"
                 };
    }];

//3.MJExtension框架內(nèi)部實現(xiàn)原理-運行時
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趁餐,隨后出現(xiàn)的幾起案子喷兼,更是在濱河造成了極大的恐慌,老刑警劉巖后雷,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件季惯,死亡現(xiàn)場離奇詭異吠各,居然都是意外死亡,警方通過查閱死者的電腦和手機勉抓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門贾漏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人藕筋,你說我怎么就攤上這事纵散。” “怎么了隐圾?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵伍掀,是天一觀的道長。 經(jīng)常有香客問我暇藏,道長蜜笤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任盐碱,我火速辦了婚禮把兔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓮顽。我一直安慰自己县好,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布暖混。 她就那樣靜靜地躺著缕贡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儒恋。 梳的紋絲不亂的頭發(fā)上善绎,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音诫尽,去河邊找鬼禀酱。 笑死,一個胖子當(dāng)著我的面吹牛牧嫉,可吹牛的內(nèi)容都是我干的剂跟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼酣藻,長吁一口氣:“原來是場噩夢啊……” “哼曹洽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辽剧,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤送淆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怕轿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偷崩,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡辟拷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阐斜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衫冻。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谒出,靈堂內(nèi)的尸體忽然破棺而出隅俘,到底是詐尸還是另有隱情,我是刑警寧澤笤喳,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布为居,位于F島的核電站,受9級特大地震影響莉测,放射性物質(zhì)發(fā)生泄漏颜骤。R本人自食惡果不足惜唧喉,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一捣卤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧八孝,春花似錦董朝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至楼入,卻和暖如春哥捕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘉熊。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工遥赚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阐肤。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓凫佛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親孕惜。 傳聞我的和親對象是個殘疾皇子愧薛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件衫画、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 剛收到師侄允的消息丰榴,說他要轉(zhuǎn)服了 江南和我有個師門群货邓,里面只有我們兩的徒弟。由于江南收徒弟上癮四濒,卻沒有一直陪著她的...
    長長長長長娟閱讀 186評論 0 1
  • 小西用橡皮泥做各式各樣的陀螺盗蟆,一直用袋子裝著戈二,上學(xué)帶走。放學(xué)帶回來藏在小西弟弟看不到的地方喳资。 這一次放學(xué)觉吭,小西隨手...
    任小藝閱讀 483評論 0 2
  • 沒錯,就是來聊天的 一 秋天的天氣這么好仆邓,空氣清新鲜滩,人心舒爽,每一個細(xì)胞都非常放松节值,清清涼涼的的小風(fēng)吹來徙硅,午覺醒來...
    亦舊姨心閱讀 600評論 0 0