JSON數據解析

JSON的簡單介紹

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

JSON的解析

  • 1)json數據->OC對象 (返序列化處理)
    方法內部實現了將二進制數轉換成JSON數據,再將JSON數據轉換成OC對象的過程
//JSON數據 -->> OC對象 方法
+(id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
  • 2)OC對象->JSON對象 (序列化處理)
// OC對象 -->> JSON數據 方法
+(NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
  • 3)OC對象和JSON數據格式之間的一一對應關系
  • 4)如何查看復雜的JSON數據

JSON解析相關代碼

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

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

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

                //4.當接收到服務器響應的數據后,解析數據(JSON--->OC)

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

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

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

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

            NSLog(@"%@", [obj class]);
        }
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容