1. 程式人生 > >iOS 【序列化 與 反序列化】

iOS 【序列化 與 反序列化】

主要記住兩個過程和呼叫的方法:

反序列化: 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