JSON與OC互相轉換


1.0 JSON解析

  • 1.1 JSON簡單介紹

    001 問:什么是JSON
    答:
    (1)JSON是一種輕量級的數據格式,一般用於數據交互
    (2)服務器返回給客戶端的數據,一般都是JSON格式或者XML格式(文件下載除外)
    002 相關說明
    (1)JSON的格式很像OC中的字典和數組
    {"name" : "jack", "age" : 10}
    {"names" : ["jack", "rose", "jim"]}

     (2)標准JSON格式: key必須是雙引號
    
  • 要想從JSON中挖掘出具體數據,得對JSON進行解析
    JSON 轉換為 OC數據類型

    003 JSON解析方案
    a.第三方框架 JSONKit\SBJSON\TouchJSON
    b.蘋果原生(NSJSONSerialization)

  • 1.2 JSON 和 OC 轉換對照表

  • 1.3 JSON解析相關代碼

(1)json數據->OC對象

//把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);

    }];
}

(2)OC對象->JSON對象

 //1.要轉換成JSON數據的OC對象*這里是一個字典
    NSDictionary *dictM = @{
                            @"hwm":@"是壞蛋",
                            @"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:dict options:kNilOptions error:nil];// OC對象 -> JSON數據 [數據傳輸只能以進制流方式傳輸,所以傳輸給我們的是進制流,但是本質是JSON數據

    NSLog(@"%@", data);
    NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

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

(3)OC對象和JSON數據格式之間的一一對應關系

//OC對象和JSON數據之間的一一對應關系
-(void)oCWithJSON
{
    //JSON的各種數據格式
    //NSString *test = @"\"windy聽話\"";
    //NSString *test = @"true";
    NSString *test = @"{\"name\":\"windy聽話\"}";

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

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


    /* JSON數據格式和OC對象的一一對應關系
         {} -> 字典
         [] -> 數組
         "" -> 字符串
         10/10.1 -> NSNumber
         true/false -> NSNumber
         null -> NSNull
     */
}
}

(4)如何查看復雜的JSON數據

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM