JSON數(shù)據(jù)解析

JSON的簡(jiǎn)單介紹

  • 1.什么是JSON
    (1)JSON是一種輕量級(jí)的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互
    (2)服務(wù)器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XML格式(文件下載除外)
  • 2.相關(guān)說(shuō)明
    (1)JSON的格式很像OC中的字典和數(shù)組
    (2)標(biāo)準(zhǔn)JSON格式key必須是雙引號(hào)
    "開(kāi)發(fā)中的注意點(diǎn)":有些不標(biāo)準(zhǔn)的可能寫(xiě)成單引號(hào), 安卓和 Java 可以解析, 但是蘋(píng)果不能解析, 只能讓后臺(tái)改
  • 3.JSON解析方案
    a.第三方框架 JSONKit\SBJSON\TouchJSON
    b.蘋(píng)果原生(NSJSONSerialization)也是性能最好的

JSON的解析

  • 1)json數(shù)據(jù)->OC對(duì)象 (返序列化處理)
    方法內(nèi)部實(shí)現(xiàn)了將二進(jìn)制數(shù)轉(zhuǎn)換成JSON數(shù)據(jù),再將JSON數(shù)據(jù)轉(zhuǎn)換成OC對(duì)象的過(guò)程
//JSON數(shù)據(jù) -->> OC對(duì)象 方法
+(id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
  • 2)OC對(duì)象->JSON對(duì)象 (序列化處理)
// OC對(duì)象 -->> JSON數(shù)據(jù) 方法
+(NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
  • 3)OC對(duì)象和JSON數(shù)據(jù)格式之間的一一對(duì)應(yīng)關(guān)系
  • 4)如何查看復(fù)雜的JSON數(shù)據(jù)

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

  • json數(shù)據(jù)->OC對(duì)象
    步驟:
    1.獲取請(qǐng)求返回的二進(jìn)制數(shù)據(jù)
    2.將返回的二進(jìn)制數(shù)據(jù)通過(guò)NSJSONSerialization轉(zhuǎn)換成想要的數(shù)據(jù)數(shù)組或字典數(shù)據(jù)類型
//把json數(shù)據(jù)轉(zhuǎn)換為OC對(duì)象
        -(void)jsonToOC
        {
            //1. 確定url路徑
            NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=33&pwd=33&type=JSON"];

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

            //3.使用NSURLSession發(fā)送一個(gè)異步請(qǐng)求
            [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)

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

            }];
        }
  • OC對(duì)象 ->JSON數(shù)據(jù)
    步驟:
    1.創(chuàng)建要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對(duì)象
    2.通過(guò)蘋(píng)果原聲的類NSJSONSerializationOC對(duì)象轉(zhuǎn)換成JSON數(shù)據(jù)
    3.通過(guò)打印轉(zhuǎn)成二進(jìn)制數(shù)據(jù)的OC對(duì)象(要轉(zhuǎn)換成字符串),可以查看轉(zhuǎn)換的結(jié)果
//1.要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對(duì)象*這里是一個(gè)字典
 NSDictionary *dictM = @{
                                    @"name":@"wendingding",
                                    @"age":@100,
                                    @"height":@1.72
                                    };
            //2.OC->JSON
            /*
             注意:可以通過(guò)+ (BOOL)isValidJSONObject:(id)obj;方法判斷當(dāng)前OC對(duì)象能否轉(zhuǎn)換為JSON數(shù)據(jù)
             具體限制:
                 1.obj 是NSArray 或 NSDictionay 以及他們派生出來(lái)的子類
                 2.obj 包含的所有對(duì)象是NSString,NSNumber,NSArray,NSDictionary 或NSNull
                 3.字典中所有的key必須是NSString類型的
                 4.NSNumber的對(duì)象不能是NaN或無(wú)窮大
             */
            /*
             第一個(gè)參數(shù):要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對(duì)象,這里為一個(gè)字典
             第二個(gè)參數(shù):NSJSONWritingPrettyPrinted對(duì)轉(zhuǎn)換之后的JSON對(duì)象進(jìn)行排版,無(wú)意義
             */
            NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];

            //3.打印查看Data是否有值
            /*
             第一個(gè)參數(shù):要轉(zhuǎn)換為STring的二進(jìn)制數(shù)據(jù)
             第二個(gè)參數(shù):編碼方式,通常采用NSUTF8StringEncoding
             */
            NSString *strM = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",strM);
  • JSON數(shù)據(jù)格式和OC對(duì)象的一一對(duì)應(yīng)關(guān)系
    "JSON數(shù)據(jù)格式和OC對(duì)象的一一對(duì)應(yīng)關(guān)系"
    {} -> 字典
    [] -> 數(shù)組
    "" -> 字符串
    10/10.1 -> NSNumber
    true/false -> NSNumber
    null -> NSNull
OC對(duì)象和JSON數(shù)據(jù)格式之間的一一對(duì)應(yīng)關(guān)系
        //OC對(duì)象和JSON數(shù)據(jù)之間的一一對(duì)應(yīng)關(guān)系
        -(void)oCWithJSON
        {
            //JSON的各種數(shù)據(jù)格式
            //NSString *test = @"\"wendingding\"";
            //NSString *test = @"true";
            NSString *test = @"{\"name\":\"wendingding\"}";

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

            NSLog(@"%@", [obj class]);
        }
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容