**@JSON**(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數據交換語言。易于人閱讀和編寫,同時也易于機器解析和生成
**@JSON 語法規則:**
1.JSON 語法是 JavaScript 對象表示語法的子集。
? ?數據在名稱/值對中
? ?數據由逗號分隔
? ?花括號保存對象
? ?方括號保存數組
? ?JSON 名稱/值對
2.JSON 數據的書寫格式是:名稱/值對。
? ?名稱/值對包括字段名稱(在雙引號中),后面寫一個冒號,然后是值:"firstName":"John"
3.JSON 值可以是:
? ?數字(整數或浮點數)
? ?字符串(在雙引號中)
? ?邏輯值(true 或 false)
? ?數組(在方括號中)
? ?對象(在花括號中)
? ?null
**@JSON建構有兩種結構:**
json簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種復雜的結構
1、對象:對象在js中表示為“{}”括起來的內容,數據結構為 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。
2、數組:數組在js中是中括號“[]”括起來的內容,數據結構為 ["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。
經過對象、數組2種結構就可以組合成復雜的數據結構了。
**@基礎示例**
? ? ---整體是個對象,對象的key是"programmers",value是一個數組,數組里面又包含3個對象
{"programmers":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
],
"authors":[
{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},
{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},
{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}
],
"musicians":[
{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},
{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}
]}
**@具體形式:**
1、對象是一個無序的“‘名稱/值’對”集合。
(1)一個對象以“{”(左括號)開始,“}”(右括號)結束。
(2)每個“名稱”后跟一個“:”(冒號);
(3)“‘名稱/值’ 對”之間使用“,”(逗號)分隔。(如圖所示,圖中表示數據的方式是類似非確定性[自動機](http://baike.baidu.com/view/409351.htm)的形式,沒學過[編譯原理](http://baike.baidu.com/view/29903.htm)的人,可能理解起來困難點,實際上也是[正則表達式](http://baike.baidu.com/view/94238.htm)的形式。下同)
例子:表示人的一個對象:
{
"姓名":"大憨",
"年齡":24
}
2、數組是值(value)的有序集合。
(1)一個數組以“[”(左中括號)開始,“]”(右中括號)結束。
(2)值之間使用“,”(逗號)分隔。
例子:一組學生
{
"學生":
[
{"姓名":"小明","年齡":23},
{"姓名":"大憨","年齡":24}
]
}
說明:此Json對象包括了一個學生數組,而學生數組中的值又是兩個Json對象。
3、值(value)可以是雙引號括起來的字符串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。
4、[字符](http://baike.baidu.com/view/263416.htm)串(string)是由雙引號包圍的任意數量Unicode字符的集合,使用反斜線轉義。一個字符(character)即一個單獨的字符串(character string)。 字符串(string)與C或者Java的字符串非常相似。
5、數值(number)也與C或者Java的數值非常相似。除去未曾使用的[八進制](http://baike.baidu.com/view/234126.htm)與十六進制格式。除去一些編碼細節。
**@系統提供的JSON解析類----NSJSONSerialization**
~~~
#pragma mark - 系統提供的JSON解析類
- (void)onClickSystem{
// 加載一個本地的JSON文件路徑,放到NSData對象中去
NSData * jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Person" ofType:@"txt"]];
NSError * error = nil;
// 把一個json格式的data,解析為OC中的數據對象(一般為數組或字典)
id obj = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
// 判斷一下,id是NSMutableArray類型還是NSMutableDictionary
if ([obj isKindOfClass:[NSArray class]]) {
NSMutableArray * array = obj;
NSLog(@"*************%@",array);
}else{
NSMutableDictionary * dic = obj;
NSLog(@"???????????????%@",dic);
}
// 把一個OC中的數據對象(數組或對象--在OC中類似字典)轉換成JSON格式的數據
NSDictionary * dic = @{@"to": @"壯壯",@"content":@"晚上見",@"from": @"曉宇",@"data": @"2014.04.18"};
NSLog(@"DIC = %@",dic);
NSData * data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];
// 把一個json格式的data,解析為OC中的NSString類型對象
// 無特殊意義,一般用來查看JSON文本封裝成 數組 還是 對象(OC中為字典)
NSString * jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"-----------------------------%@",jsonString);
}
~~~
**@第三方類----JSONKit**
~~~
#pragma mark - 第三方類JSONKit
- (void)onClickJSONKit{
#pragma mark 把JSON格式的數據轉換成OC中的數據對象
// 從文檔中讀取json格式的Data
NSData * jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Person" ofType:@"txt"]];
// json格式的Data轉化為OC對象
id obj1 = [jsonData objectFromJSONData];
NSLog(@"%@",obj1);
// 從文檔中讀取json格式的String
NSString * jsonString = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Person" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil];
// json格式的String轉化為OC對象
id obj2 = [jsonString objectFromJSONString];
NSLog(@"%@",obj2);
#pragma mark 把一個OC中的數據對象轉換成JSON格式的數據
NSDictionary * dic = @{@"to": @"壯壯",@"content":@"晚上見",@"from": @"曉宇",@"data": @"2014.04.18"};
// 轉化為json格式的Data
NSData * dataJson = [dic JSONData];
// 轉化為json格式的String
NSString * stringJson = [dic JSONString];
}
~~~
@代碼樣例:
~~~
{
"country": {
"province": {
"-number": "3",
"-name": "河北",
"city": [
{
"-number": "9",
"-name": "張家口市",
"area": [
{
"-number": "146",
"#text": "橋西區"
},
{
"-number": "147",
"#text": "橋東區"
},
{
"-number": "148",
"#text": "宣化區"
},
{
"-number": "149",
"#text": "下花園區"
},
{
"-number": "150",
"#text": "宣化縣"
},
{
"-number": "151",
"#text": "張北縣"
},
{
"-number": "152",
"#text": "康保縣"
},
{
"-number": "153",
"#text": "沽源縣"
},
{
"-number": "154",
"#text": "尚義縣"
},
{
"-number": "162",
"#text": "崇禮縣"
}
]
},
{
"-number": "10",
"-name": "承德市",
"area": [
{
"-number": "163",
"#text": "雙橋區"
},
{
"-number": "164",
"#text": "雙灤區"
},
{
"-number": "165",
"#text": "鷹手營子礦區"
},
{
"-number": "166",
"#text": "承德縣"
},
{
"-number": "167",
"#text": "興隆縣"
},
{
"-number": "168",
"#text": "平平縣"
},
{
"-number": "169",
"#text": "灤平縣"
}
]
},
{
"-number": "11",
"-name": "滄州市",
"area": [
{
"-number": "174",
"#text": "運河區"
},
{
"-number": "175",
"#text": "新華區"
},
{
"-number": "176",
"#text": "泊頭區"
},
{
"-number": "177",
"#text": "任丘區"
},
{
"-number": "185",
"#text": "肅寧縣"
},
{
"-number": "186",
"#text": "南皮縣"
}
]
},
{
"-number": "12",
"-name": "廊坊市",
"area": [
{
"-number": "190",
"#text": "安次區"
},
{
"-number": "191",
"#text": "廣陽區"
},
{
"-number": "192",
"#text": "霸州市"
},
{
"-number": "193",
"#text": "三河市"
},
{
"-number": "194",
"#text": "固安縣"
},
{
"-number": "195",
"#text": "永清縣"
}
]
},
{
"-number": "13",
"-name": "衡水市",
"area": [
{
"-number": "202",
"#text": "桃城區"
},
{
"-number": "203",
"#text": "冀州市"
},
{
"-number": "204",
"#text": "深州市"
},
{
"-number": "205",
"#text": "棗強縣"
},
{
"-number": "206",
"#text": "武邑縣"
}
]
}
]
}
}
}
~~~
~~~
#pragma mark - 系統類NSJSONSerialization
- (void)initializeAllDataOfNSJSONSerialization{
self.allProvinceArray = [NSMutableArray array];
NSData * jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"hebei" ofType:@"txt"]];
NSError * error = nil;
id obj = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
NSMutableDictionary * countryDic = obj;
NSDictionary * countryInfo = [countryDic objectForKey:@"country"];
NSDictionary * provinceInfo = [countryInfo objectForKey:@"province"];
NSString * pName = [provinceInfo objectForKey:@"-name"];
NSString * pNumber = [provinceInfo objectForKey:@"-number"];
HMTProvince * province = [[HMTProvince alloc]initWithName:pName withNumber:pNumber];
[self.allProvinceArray addObject:province];
NSArray * cityArray = [provinceInfo objectForKey:@"city"];
for (int i = 0; i < [cityArray count]; i++) {
NSDictionary * cityInfo = [cityArray objectAtIndex:i];
NSString * cName = [cityInfo objectForKey:@"-name"];
NSString * cNumber = [cityInfo objectForKey:@"-number"];
HMTCity * city = [[HMTCity alloc]initWithName:cName withNumber:cNumber];
[province.cityArray addObject:city];
NSArray * areaArray = [cityInfo objectForKey:@"area"];
for (int j = 0; j < [areaArray count]; j++) {
NSString * aName = [[areaArray objectAtIndex:j] objectForKey:@"#text"];
NSString * aNumber = [[areaArray objectAtIndex:j] objectForKey:@"-number"];
HMTArea * area = [[HMTArea alloc]initWithName:aName withNumber:aNumber];
[city.areaArray addObject:area];
[area release];
}
[city release];
}
[province release];
}
#pragma mark - 系統類JSONKit
- (void)initializeAllDataOfJSONKit{
self.allProvinceArray = [NSMutableArray array];
NSData * jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"hebei" ofType:@"txt"]];
id obj = [jsonData objectFromJSONData];
NSMutableDictionary * countryDic = obj;
NSDictionary * countryInfo = [countryDic objectForKey:@"country"];
NSDictionary * provinceInfo = [countryInfo objectForKey:@"province"];
NSString * pName = [provinceInfo objectForKey:@"-name"];
NSString * pNumber = [provinceInfo objectForKey:@"-number"];
HMTProvince * province = [[HMTProvince alloc]initWithName:pName withNumber:pNumber];
[self.allProvinceArray addObject:province];
NSArray * cityArray = [provinceInfo objectForKey:@"city"];
for (int i = 0; i < [cityArray count]; i++) {
NSDictionary * cityInfo = [cityArray objectAtIndex:i];
NSString * cName = [cityInfo objectForKey:@"-name"];
NSString * cNumber = [cityInfo objectForKey:@"-number"];
HMTCity * city = [[HMTCity alloc]initWithName:cName withNumber:cNumber];
[province.cityArray addObject:city];
NSArray * areaArray = [cityInfo objectForKey:@"area"];
for (int j = 0; j < [areaArray count]; j++) {
NSString * aName = [[areaArray objectAtIndex:j] objectForKey:@"#text"];
NSString * aNumber = [[areaArray objectAtIndex:j] objectForKey:@"-number"];
HMTArea * area = [[HMTArea alloc]initWithName:aName withNumber:aNumber];
[city.areaArray addObject:area];
[area release];
}
[city release];
}
[province release];
}
~~~
- 前言
- 沙盒機制與文件(一)
- 沙盒機制和文件(二)
- 沙盒機制和文件(三)
- NSBundle介紹以及讀取沙盒文件路徑問題
- 數據持久化(一)-----歸檔 讀寫 文件路徑
- 數據持久化(二)-----Sqlite
- 數據持久化(三)使用第三方類庫FMDB
- 數據持久化(四)之NSUserDefaults
- 數據持久化(五)之CoreData
- 數據持久化(六)之Using CoreData with MagicalRecord
- 數據解析(一)解析XML之系統自帶NSXMLParse類
- 數據解析(二)解析XML之GDataXMLNode
- 數據解析(三)解析JSON-----系統自帶NSJSONSerialization 與 第三方JSONKit
- iOS多線程編程(一)NSThread
- iOS多線程編程(二)NSOperationQueue
- iOS多線程編程(三)Grand Central Dispatch(GCD)詳解
- iOS網絡編程(一)NSURLConnection
- iOS網絡編程(二) 自定義請求網絡類----推薦用于需要請求過程片段數據
- iOS網絡編程(三) 異步加載及緩存圖片---->SDWebImage
- iOS網絡編程(四) 異步加載及緩存圖片-----自定義類
- iOS網絡編程(五) 異步加載及緩存圖片-----EGO
- iOS網絡編程(六) NSURLSession詳解
- iOS網絡編程(7) 第三方開源庫----->AFNetworking