你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS編程技術 >> iOS 網絡編程:JSON解析

iOS 網絡編程:JSON解析

編輯:IOS編程技術

1 JSON文檔結構

1.1 簡介

       JSON(javaScript Object Notation)是存儲和交換文本信息的語法,類似 XML。JSON 比 XML 更小、更快,更易解析,是一種輕量級的數據交換格式。所謂輕量級是指與XML文檔結構相比描述相同的數據所需的字符個數要少。

    簡單的說JSON由兩種數據類型組成數組詞典

1.2 語法

      JSON 語法是 JavaScript 語法的子集,但對於IOS開發來說,可以不需要太多了解JavaScript語法。

1) JSON 語法規則

  • 數據在名稱/值對中
  • 數據由逗號分隔
  • 花括號保存對象(無序容器)
  • 方括號保存數組(有序容器)

 

2) JSON 名稱/值對

      名稱/值對相當是IOS中的詞典,即是映射表,但是JSON中的"名稱"必須是由字符串表示。 名稱/值對包括字段名稱(在雙引號中),後面寫一個冒號,然後是

"firstName" : "John"

 

3) JSON 值

JSON 值可以是:

  • 數字(整數或浮點數)
  • 字符串(在雙引號中)
  • 邏輯值(true 或 false)
  • 數組(在方括號中)
  • 對象(在花括號中)
  • null

 

圖 1

4) JSON 對象

    JSON 對象花括號中書寫,對象可以包含多個"名稱/值"對,即對象是一個無序的"名稱/值"對集合

 

圖 2

 

firstName":"John" , "lastName":"Doe" }

 

5) JSON 數組

    JSON 數組方括號中書寫,數組可包含多個對象,即數組有序集合

 

圖 3

{
"employees": [
{ "firstName":"John" , "lastName":"Doe" }, 
{ "firstName":"Anna" , "lastName":"Smith" }, 
{ "firstName":"Peter" , "lastName":"Jones" }
]
}

      在上面的例子中,對象 "employees" 是包含三個對象的數組。每個對象代表一條關於某人(有姓和名)的記錄。

 

2 JSON數據解碼

2.1 IOS解碼技術

目前有如下的幾種解碼技術,性能是從低到高排序,

  • JBjson:比較老的第三方框架;
  • TouchJSON:也是老的第三方框架;
  • YAJL:也是比較老,但性能較高;
  • JSONKit:比較優秀的JSON框架,解碼速度快
  • NSJSONSerialization它是IOS5之後Apple提供的官方API,是目前最優秀的JSON編碼/解碼框架。

 

2.2 NSJSONSerialization

      在IOS中對JSON文件的解碼和編碼是通過NSJSONSerialization類實現的,該類的使用方式非常方便和簡單。NSJSONSerialization類的設計思想是通過一個"中介對象"與JSON文件進行互相轉換

2.2.1 以NSData為中介

      由於NSData對象能夠直接與文件進行交互,所以就能夠以NSData對象為中間轉換介質,如下圖所示的轉換過程。

 

注意:

       這裡的JSON對象可以是數組、詞典等類型,具體看最外層"{}"內的類型。

 

 

如下所示的"Notes.json" JSON文件,


"ResultCode":110, 
"Record":112 
}

 

如下的程序是對JSON文件進行解析為字典,然後驗證是否正確;接著重新將字典編碼為JSON文件。

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     // Do any additional setup after loading the view, typically from a nib.
 4     
 5     NSString *path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"];
 6     
 7     NSData *jsonData = [[NSData alloc] initWithContentsOfFile:path];
 8     id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];
 9     
10     NSInteger id = [jsonObj objectForKey:@"ResultCode"];
11     NSLog(@"%@",[jsonObj objectForKey:@"ResultCode"]);
12     
13     NSData *data = [NSJSONSerialization dataWithJSONObject:jsonObj options:nil error:nil];
14     [data writeToFile:@"/Users/tengfei/Desktop/s.json" atomically:true];   
15 }

 

2.2.2 以Stream為中介

      與NSData轉換中介不同,通過Stream轉換它是通過兩種不同的對象進行。當進行JSON文件解析時,是通過NSInputStream;而當進行編碼時,是通過NSOutputStream進行

 

 

 

如下表是兩種Stream的創建方法:

類名

創建Stream方法

NSInputStream

+ (instancetype)inputStreamWithData:(NSData *)data

+ (instancetype)inputStreamWithFileAtPath:(NSString *)path

+ (instancetype)inputStreamWithURL:(NSURL *)url

- (instancetype)initWithData:(NSData *)data

- (instancetype)initWithFileAtPath:(NSString *)path

- (instancetype)initWithURL:(NSURL *)url

NSOutputStream

+ (instancetype)outputStreamToMemory

+ (instancetype)outputStreamToFileAtPath:(NSString *)path append:(BOOL)shouldAppend

+ (instancetype)outputStreamWithURL:(NSURL *)url append:(BOOL)shouldAppend

- (instancetype)initToMemory

- (instancetype)initToFileAtPath:(NSString *)path append:(BOOL)shouldAppend

- (instancetype)initWithURL:(NSURL *)url append:(BOOL)shouldAppend

 

如下是通過Stream進行JSON文件的編碼和解碼的簡單示例:

 1 -(void) testJsonWithStream
 2 {
 3     NSString *path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; //獲取文件的NSString路徑
 4     
 5     NSInputStream *inputStream = [[NSInputStream alloc] initWithFileAtPath:path]; //創建Stream對象
 6     [inputStream open]; //打開Stream對象
 7     
 8     id jsonObj = [NSJSONSerialization JSONObjectWithStream:inputStream options:NSJSONReadingMutableLeaves error:nil];
 9     
10     NSInteger id = [jsonObj objectForKey:@"ResultCode"];
11     NSLog(@"%@",[jsonObj objectForKey:@"ResultCode"]);
12     
13     //創建輸出流
14     NSOutputStream *outpuStream = [[NSOutputStream alloc] initToFileAtPath:@"/Users/tengfei/Desktop/s.json" append:true];
15     [outpuStream open];   //打開Stream對象
16     [NSJSONSerialization writeJSONObject:jsonObj toStream:outpuStream options:0 error:nil];
17 }
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved