首页 > 代码库 > JSON解析 实现界面 数据分离.

JSON解析 实现界面 数据分离.

JSON

作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式

基于JavaScript的一个子集

易读性略差,编码手写难度大,数据量小

JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,我们会陷入繁琐复杂的数据节点查找中

JSON格式说明

对象

{}

格式 {key : value, key : value,...} 的键值对的结构

可以反序列化为OC中的NSDictionary

数组

[]

格式 ["java","javascript","vb",...]

可以反序列化为OC中的NSArray

提示

JSON的数据格式与OC中的快速包装方法非常类似

JSON的数据格式同样支持嵌套

 

 

解析服务器端返回JSON数据

 

从iOS 5开始,使用NSJSONSerialization对JSON解析

 

其他常见的三种JSON解析第三方库:

SBJson 因为API简单易用,可能还会有一些应用中留存

JSONKit JSONKit的开发者称:JSONKit的性能优于苹果

TouchJson

 

 

JSON的序列化和反序列化

反序列化

[NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

 

序列化

[NSJSONSerialization dataWithJSONObject:array options:0 error:NULL];

 

NSJSONReadingOptions

NSJSONReadingMutableContainers = 1,    根节点可变

NSJSONReadingMutableLeaves = 2,          节点可变

NSJSONReadingAllowFragments = 4,         根节点可以不是NSDictionary或者NSArray

 

 

 

 

//代码解析步骤

#import <Foundation/Foundation.h>

 

@interface Video : NSObject

 

@property (nonatomic, copy) NSNumber *videoId;

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSNumber *length;

@property (nonatomic, copy) NSString *videoURL;

@property (nonatomic, copy) NSString *imageURL;

@property (nonatomic, copy) NSString *desc;

 

- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)videoWithDict:(NSDictionary *)dict;

 

@end

 

 

#import "Video.h"

@implementation Video

 

- (instancetype)initWithDict:(NSDictionary *)dict

{

    self = [super init];

    if (self) {

        [self setValuesForKeysWithDictionary:dict];

    }

    return self;

}

 

+ (instancetype)videoWithDict:(NSDictionary *)dict

{

    return [[self alloc] initWithDict:dict];

}

 

 

 

@end

 

 

 

//解析步骤

#import "PLMJSONViewController.h"

#import "Video.h"

 

@interface PLMJSONViewController ()

 

@end

 

@implementation PLMJSONViewController

 

/** 重写父类的加载数据方法 */

- (void)loadData

{

    NSLog(@"%s", __func__);

    

    // 1. url

    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/videos.json"];

    

    // 2. request

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    

    // 3. 发送异步请求

    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        

        // data是一个json数据

        // 对data进行反序列化,解析(很多时候我们解析出来的是字典)

        NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

        

        // 建立视频的数组

        NSMutableArray *arrayM = [NSMutableArray array];

        

        for (NSDictionary *dict in array) {

            [arrayM addObject:[Video videoWithDict:dict]];

        }

        

        // 刷新数据,更新UI

        dispatch_async(dispatch_get_main_queue(), ^{

            self.dataList = arrayM;

        });

    }];

}

 

@end

 

#import <UIKit/UIKit.h>

 

@interface PLMViewController : UITableViewController

 

@property (nonatomic, strong) NSArray *dataList;

 

/** 加载网络数据 */

- (void)loadData;

 

@end

 

#import "PLMViewController.h"

#import "Video.h"

 

@interface PLMViewController ()

 

@end

 

@implementation PLMViewController

 

/** 设置表格的数组数据 */

- (void)setDataList:(NSArray *)dataList

{

    _dataList = dataList;

    

    // 表格的数据源,绑定在dataList,当重新设置了dataList的内容,需要刷新表格

    [self.tableView reloadData];

    

    // 停止刷新控件

    [self.refreshControl endRefreshing];

}

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    

    // 加载网络数据

    [self loadData];

}

 

- (IBAction)refresh

{

    [self loadData];

}

 

- (void)loadData

{

    // 此方法的具体实现在子类中

}

 

#pragma mark - 表格的数据源方法

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return self.dataList.count;

}

 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    static NSString *ID = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    

    Video *v = self.dataList[indexPath.row];

    cell.textLabel.text = v.name;

    

    return cell;

}

 

@end