iOS 【序列化 與 反序列化】
阿新 • • 發佈:2019-02-04
主要記住兩個過程和呼叫的方法:
反序列化: JSON ---> OC物件:JSONObjectWithData
序列化: OC物件 ---> JSON:dataWithJSONObject
以上兩個方法均為 NSJSONSerialization 的類方法
// // ViewController.m // 0715-03JSON解析-01 // // Created by 王中堯 on 16/7/15. // Copyright © 2016年 wzy. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // [self jsonToOC]; // [self ocToJSON]; // [self other1]; // [self other2]; [self other3]; } // JSON ---> OC物件 - (void)jsonToOC { NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { /* 第一個引數:要解析的JSON資料,是NSData型別也就是二進位制資料 第二個引數: 解析JSON的可選配置引數 NSJSONReadingMutableContainers 解析出來的字典和陣列是可變的 NSJSONReadingMutableLeaves 解析出來的物件中的字串是可變的 iOS7以後有問題 NSJSONReadingAllowFragments 被解析的JSON資料如果既不是字典也不是陣列, 那麼就必須使用這個 */ id obj = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; NSLog(@"%@---%@", [obj class], obj); /* __NSCFDictionary---{ success = "\U767b\U5f55\U6210\U529f"; */ }]; [task resume]; } // OC物件 ---> JSON - (void)ocToJSON { // NSString *str = @"wangzhongyao"; NSArray *str = @[@"wzy", @"wdd"]; /* 注意:可以通過+ (BOOL)isValidJSONObject:(id)obj;方法判斷當前OC物件能否轉換為JSON資料 具體限制: 1.obj 是NSArray 或 NSDictionay 以及他們派生出來的子類 2.obj 包含的所有物件是 NSString,NSNumber,NSArray,NSDictionary 或 NSNull 3.字典中所有的key必須是NSString型別的 4.NSNumber的物件不能是NaN或無窮大 */ if ([NSJSONSerialization isValidJSONObject:str]) { /* 第一個引數:要轉換成JSON資料的OC物件 第二個引數:NSJSONWritingPrettyPrinted對轉換之後的JSON物件進行排版(只有一個列舉值選擇 NSJSONWritingPrettyPrinted),無意義 設定上排版格式,會由 ["wzy","wdd"] ---> [ "wzy", "wdd" ] */ NSData *data = [NSJSONSerialization dataWithJSONObject:str options:kNilOptions error:nil]; NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); } else { NSLog(@"該資料不支援轉換為JSON格式"); } } // 一些特別的資料轉化為JSON是什麼形式 - (void)other1 { // 注意: NSArray *arr = @[@{@"name" : [NSNull null]}, @{@"age" : @true}, @{@"age1" : @false}]; // 列印結果: [{"name":null},{"age":1},{"age1":0}] NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:kNilOptions error:nil]; NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); } // 將plist檔案轉化為JSON並存儲 // OC物件轉化為JSON(用 dataWithJSONObject 方法) - (void)other2 { NSArray *arr = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.plist" ofType:nil]]; NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:kNilOptions error:nil]; [data writeToFile:@"/Users/wangzhongyao/Desktop/app123123.json" atomically:YES]; NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); } // 將JSON檔案解析轉化為oc物件並存儲 // JSON轉化為OC物件(用 JSONObjectWithData 方法) - (void)other3 { NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.json" ofType:nil]]; NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; [arr writeToFile:@"/Users/wangzhongyao/Desktop/arr123123.plist" atomically:YES]; } @end