iOS開發實踐之JSON
伺服器返回給用戶端的資料,一般都是JSON格式或者XML格式(檔案下載除外),JSON和XML的比較這裡不詳述。 總的來說XML檔案龐大,檔案格式複雜,解析需要花費較多的資源和時間,傳輸占頻寬。JSON資料格式比較簡單,易於讀寫,格式都是壓縮的,佔用頻寬小,移動開發首選。
JSON:
1、JSON的格式很像OC中的字典和數組
{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}
標準JSON格式的注意點:key必須用雙引號
JSON – OC 轉換對照表:
2、在iOS中,JSON的常見解析方案有4種
第三方架構:JSONKit、SBJson、TouchJSON(效能從左至右,越差)
蘋果原生(內建):NSJSONSerialization(效能最好)
NSJSONSerialization的常見方法:
2.1、JSON 轉 OC對象(其中的過程是json轉換為字典,字典再轉換為對象)
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
例子: 請求伺服器,返回json資料。json資料封裝到數組對象中。
伺服器返回資料json格式:
- (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL URLWithString:@"http://localhost:8080/myService/video"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { if (connectionError || data==nil) { [MBProgressHUD showError:@"網路繁忙,請稍後再試!"]; return ; } //json 轉化為data 得到字典 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; //取出字典中的某一個key NSArray *videoArray = dict[@"videos"]; //字典轉模型 for (NSDictionary *videoDict in videoArray) { //字典轉模型(對象) Video *video = [Video videoWithDict:videoDict]; [self.videos addObject:video]; } }]; }
2.2、OC對象 轉JSON資料 (對象轉字典,字典再轉json)
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
#import "ViewController.h"#import "Person.h"@interface ViewController ()@property(nonatomic,strong) Person *person;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; _person = [[Person alloc]init]; _person.name = @"kobe"; _person.age = 24; _person.sex = @"男"; _person.phone = @"1112334444"; }-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ //person 轉字典 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; dict[@"age"] = [NSString stringWithFormat:@"%d",self.person.age]; dict[@"name"] = self.person.name; dict[@"sex"] = self.person.sex; dict[@"phone"] = self.person.phone; NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil]; NSString *dataStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",dataStr); }@end
結果:
{
"age" : "24",
"sex" : "男",
"phone" : "1112334444",
"name" : "kobe"
}
NSJSONReadingOptions枚舉:
NSJSONReadingMutableContainers:返回可變容器,NSMutableDictionary或NSMutableArray。
NSJSONReadingMutableLeaves:返回的JSON對象中字串的值為NSMutableString
NSJSONReadingAllowFragments:允許JSON字串最外層既不是NSArray也不是NSDictionary,但必須是有效JSON Fragment。
NSJSONWritingPrettyPrinted:的意思是將產生的json資料格式化輸出,這樣可讀性高,不設定則輸出的json字串就是一整行。