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 值可以是:
圖 1
4) JSON 對象
JSON 對象在花括號中書寫,對象可以包含多個"名稱/值"對,即對象是一個無序的"名稱/值"對集合。
圖 2
firstName":"John" , "lastName":"Doe" }
5) JSON 數組
JSON 數組在方括號中書寫,數組可包含多個對象,即數組是值的有序集合。
圖 3
{在上面的例子中,對象 "employees" 是包含三個對象的數組。每個對象代表一條關於某人(有姓和名)的記錄。
2 JSON數據解碼
2.1 IOS解碼技術
目前有如下的幾種解碼技術,性能是從低到高排序,
2.2 NSJSONSerialization
在IOS中對JSON文件的解碼和編碼是通過NSJSONSerialization類實現的,該類的使用方式非常方便和簡單。NSJSONSerialization類的設計思想是通過一個"中介對象"與JSON文件進行互相轉換。
2.2.1 以NSData為中介
由於NSData對象能夠直接與文件進行交互,所以就能夠以NSData對象為中間轉換介質,如下圖所示的轉換過程。
注意:
這裡的JSON對象可以是數組、詞典等類型,具體看最外層"{}"內的類型。
如下所示的"Notes.json" JSON文件,
{
如下的程序是對JSON文件進行解析為字典,然後驗證是否正確;接著重新將字典編碼為JSON文件。
1 - (void)viewDidLoad {
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