iOS-解析JSON(一)

JSON介紹

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。它使得人們很容易的進行閱讀和編寫。同時也方便了機器進行解析和生成。JSON采用完全獨立于程序語言的文本格式,

JSON基于兩種結(jié)構(gòu)

json簡單說就是javascript中的對象和數(shù)組,所以這兩種結(jié)構(gòu)就是對象和數(shù)組兩種結(jié)構(gòu),通過這兩種結(jié)構(gòu)可以表示各種復(fù)雜的結(jié)構(gòu)

  • 1、對象:對象在js中表示為“{}”括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 {key:value,key:value,...}的鍵值對的結(jié)構(gòu),在面向?qū)ο蟮恼Z言中,key為對象的屬性,value為對應(yīng)的屬性值,所以很容易理解,取值方法為 對象.key 獲取屬性值,這個屬性值的類型可以是 數(shù)字、字符串、數(shù)組、對象幾種。
  • 2、數(shù)組:數(shù)組在js中是中括號“[]”括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 ["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數(shù)字、字符串、數(shù)組、對象幾種。
{
    "animals": {
        "dog": [
            {
                "name": "Rufus",
                "age":15
            },
            {
                "name": "Marty",
                "age": null
            }
        ]
}

OC中的JSON

  • 注意
    OC中我們不能說JSON對象,因為JSON不是OC語言的,我們可以說JSON形式的字符串

  • OC中的JSON解析

    • 第三方框架
      • JSONKit
      • YYModel
      • ......
    • 使用系統(tǒng)的API

我們在這里主要是講一下系統(tǒng)的函數(shù)的使用

+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

我們解析下面的JSON

{
    "city":"北京",
    "day_y":"2016年1月6日",
    "weak":"星期三",
    "temperature": "-9℃~3℃",
    "weather": "晴轉(zhuǎn)多云",
    "wind":"西北風(fēng)"

}
//獲取路徑
NSString *jsonPath = [[NSBundle mainBundle] pathForResource:@"weather" ofType:@"json"];
//把json形式的字符串轉(zhuǎn)換的二進制數(shù)據(jù)
NSData *data = [NSData dataWithContentsOfFile:jsonPath];
NSError *error;
//解析的JSON字符串,返回的OC對象可能是數(shù)組或字典
id json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (error) {
    NSLog(@"解析JSON出錯---%@",error);
}
NSLog(@"%@",json);
NSLog(@"%@",[json class]);

打印結(jié)果

2016-01-06 10:27:54.197 WeatherJSON[1068:51262] {
    city = "\U5317\U4eac";
    "day_y" = "2016\U5e741\U67086\U65e5";
    temperature = "-9\U2103~3\U2103";
    weak = "\U661f\U671f\U4e09";
    weather = "\U6674\U8f6c\U591a\U4e91";
    wind = "\U897f\U5317\U98ce";
}
2016-01-06 10:27:54.197 WeatherJSON[1068:51262] __NSDictionaryM

解決控制臺打印數(shù)組,字典不顯示漢字的問題
上面打印的是__NSDictionaryM,可變的字典,所以我們?yōu)镹SDictionary寫一個分類

catagory.png
- (NSString *)descriptionWithLocale:(id)locale {

    //拼接字符串
    NSMutableString *stringM = [NSMutableString stringWithFormat:@"{\n"];
    
    //block遍歷
    [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        [stringM appendFormat:@"\t\"%@\" = \" %@\";\n",key,obj];
    }];
    
    [stringM appendString:@"}\n"];
    
    return stringM;
}

現(xiàn)在我們再看打印結(jié)果

2016-01-06 11:01:45.673 WeatherJSON[1361:70867] {
    "temperature" = " -9℃~3℃";
    "wind" = " 西北風(fēng)";
    "day_y" = " 2016年1月6日";
    "weak" = " 星期三";
    "city" = " 北京";
    "weather" = " 晴轉(zhuǎn)多云";
}
2016-01-06 11:01:45.674 WeatherJSON[1361:70867] __NSDictionaryM

這樣我們就解決了字典不顯示漢字的問題,拼接字符串的時候是基于JSON的結(jié)構(gòu),我們上述的JSON結(jié)構(gòu)是對象,轉(zhuǎn)換成OC中就是字典,如果JSON結(jié)構(gòu)是數(shù)組,那么轉(zhuǎn)換成OC中也是數(shù)組.

補充
我們可以在http://json.cn 在線解析及格式化驗證

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

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 我主張“無意識的未來”(without thought),相信人對未來的感悟也是自然的,“未來應(yīng)該在無意識中被理解...
    ONEM閱讀 275評論 0 0
  • 北狼57閱讀 232評論 0 0

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