iOS开发使用JSON解析网络数据

前言:对服务器请求之后,返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)

本篇随便先讲解JSON解析。

正文:

关于JSON:

JSON是一种轻量级的数据格式,一般用于数据交互JSON的格式很像Objective-C中的字典和数组:{"name":"jack","age":10}

补充:

  标准的JSON格式的注意点:key必须用双引号。(但是在Java中是单引号)

  JSON-OC的转换对照表

   

   其中:null--返回OC里的NSNull类型

使用:

  在JSON解析方案有很多种,但是(苹果原生的)NSJSONSerialization性能最好

  反序列化(JSON --> OC对象),下面示例解析成字典对象

  

  序列化(OC对象 --> JSON),注意字典的值不能传nil,但是可以传[NSNull null]

  

  并不是所有的类型都是可以转为JSON的

  以下是苹果官方规定:

  

我们再来看个实例:

#import "MainViewController.h"
#import "Video.h" 

#define kBaseURL @"http://192.168.3.252/~apple" 

@interface MainViewController ()
@property (strong, nonatomic) NSArray *dataList;
@property (weak, nonatomic) UITableView *tableView;
@end
@implementation MainViewController 

class="p1">

"412158" snippet_file_name="blog_20140630_1_3481337" name="code" class="objc">
#pragma mark 实例化视图
- (void)loadView
{
  self.view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame];
  //1 tableview
  CGRect frame = self.view.bounds;
  UITableView *tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height - 44) style:UITableViewStylePlain];
  //1)数据源
  [tableView setDataSource:self];
  //2)代理
  [tableView setDelegate:self];
  //)设置表格高度
  [tableView setRowHeight:80];
  [self.view addSubview:tableView];
  self.tableView = tableView; 

  //toolBar
  UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, tableView.bounds.size.height, 320, 44)];
  [self.view addSubview:toolBar]; 

  //添加toolbar按钮
  UIBarButtonItem *item1 = [[UIBarButtonItem alloc]initWithTitle:@"load json" style:UIBarButtonItemStyleDone target:self action:@selector(loadJson)];
  UIBarButtonItem *item2 = [[UIBarButtonItem alloc]initWithTitle:@"load xml" style:UIBarButtonItemStyleDone target:self action:@selector(loadXML)];
  UIBarButtonItem *item3 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
  [toolBar setItems:@[item3, item1, item3, item2, item3]];
} 

#pragma mark -uitableview数据源方法 对于uitableview下面这两个方法是必须实现的。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return self.dataList.count;
} 

//每填充一行都调用一次这个方法。知道界面上的所有行都填充完毕。,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  //使用可充用标示符查询可重用单元格
  static NSString *ID = @"MyCell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 

  if (cell == nil) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
  }
  //设置单元格内容
  Video *v = self.dataList[indexPath.row]; 

  cell.textLabel.text = v.name;
  cell.detailTextLabel.text = v.teacher;
  //加载图片
  //1)同步加载网络图片,同步方法以为这这些指令在完成之前,后续指令都无法执行。
  //注意:在开发网络应用时,不要使用同步方法加载图片,否则会严重影响用户体验
//  NSString *imagePath = [NSString stringWithFormat:@"%@%@", kBaseURL, v.imageURL];
//  NSURL *imageUrl = [NSURL URLWithString:imagePath];
//  NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];
//  UIImage *image = [UIImage imageWithData:imageData];
//
//  //2)异步加载网络图片
//  //网络连接本身就有异步命令 sendAsync
//  [cell.imageView setImage:image];
  //如果缓存图像不存在
  if (v.cacheImage == nil) {
    //使用默认图像占位,即能够保证有图像,又能够保证有地方。
    UIImage *image = [UIImage imageNamed:@"user_default.png"];
    [cell.imageView setImage:image]; //使用默认图像占位
    //开启异步连接,加载图像,因为加载完成之后,需要刷新对应的表格航
    [self loadImageAsyncWithIndexPath:indexPath];
  }else
  {
    [cell.imageView setImage:v.cacheImage];
  } 

  //[self loadImageAsyncWithUrl:imageUrl imageView:cell.imageView];
  return cell;
} 

#pragma mark 异步加载网络图片
//由于uitableview是可重用的,为了避免用户快速频繁刷新表格,造成数据冲突,不能直接将uiimageview传入异步方法
//正确的解决方法是:将表格行的indexpath传入异步方法,加载完成图像以后,直接刷新指定的行。
- (void)loadImageAsyncWithIndexPath:(NSIndexPath *)indexPath
{
  Video *v = self.dataList[indexPath.row]; //取出当前要填充的行
  NSString *imagePath = [NSString stringWithFormat:@"%@%@", kBaseURL, v.imageURL];
  NSURL *imageUrl = [NSURL URLWithString:imagePath]; 

  //NSLog(@"%@ %@", url, imageView);
  //1 request
  NSURLRequest *request = [NSURLRequest requestWithURL:imageUrl];
  //2 connection sendasync异步请求
  [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    //UIImage *image = [UIImage imageWithData:data];
    //[imageView setImage:image];
    //将网络数据保存至缓存图像。
    v.cacheImage = [UIImage imageWithData:data];
    //刷新表格
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
  }];
} 

#pragma mark 处理json数据
- (void)handlerJSONData:(NSData *)data
{
  //json文件中的[]表示一个数据。
  //反序列化json数据 

  //第二个参数是解析方式,一般用NSJSONReadingAllowFragments
  NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 

  NSLog(@"%@", array); //json解析以后是nsarray格式的数据。 

  //提示:如果开发网络应用,可以将反序列化出来的对象,保存至沙箱,以便后续开发使用。
  NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *path = [docs[0]stringByAppendingPathComponent:@"json.plist"];
  [array writeToFile:path atomically:YES]; //把array里面的数据写入沙箱中的jspn.plist中。 

  //给数据列表赋值
  NSMutableArray *arrayM = [NSMutableArray array];
  for (NSDictionary *dict in array) {
    Video *video = [[Video alloc]init];
    //给video赋值
    [video setValuesForKeysWithDictionary:dict];
    [arrayM addObject:video];
  }
  self.dataList = arrayM;
  //刷新表格
  [self.tableView reloadData]; 

  NSLog(@"%@", arrayM); //这句话将调用video里面的description和nsarray+log里面的descriptionWithLocale
} 

#pragma mark 加载json
- (void)loadJson
{
  NSLog(@"load json");
  //从web服务器加载数据
  NSString *str = @"http://www.baidu.com?format=json"; //这里是乱写的
  //提示:NSData本身具有同步方法,但是在实际开发中,不要使用次方法
  //在使用NSData的同步方法时,无法指定超时时间,如果服务器连接不正常,会影响用户体验。
  //NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:str]];
  //简历NSURL
  NSURL *url = [NSURL URLWithString:str];
  //建立NSURLRequest
  NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2.0f];
  //建立NSURLConnect的同步方法加载数据
  NSURLResponse *response = nil;
  NSError *error = nil;
  //同步加载数据
  NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
  //错误处理
  if (data != nil) {
    //下面这两句话本身没有什么意义,仅用于跟踪调试。
    NSString *result = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", result); 

    //在处理网络数据的时候,不要将NSData转换成nsstring。
    [self handlerJSONData:data];
  }else if (data == nil && error == nil){
    NSLog(@"空数据");
  }else
  {
    NSLog(@"%@", error.localizedDescription);
  }
}
#pragma mark 加载xml
- (void)loadXML
{
  NSLog(@"load xml");
}
//- (void)viewDidLoad
//{
//  [super viewDidLoad];
//} 

@end
(0)

相关推荐

  • IOS开发之JSON转PLIST实例详解

     IOS JSON转PLIST 从xx.json文件中读取JSON数据,写入到xx.plist文件中,实现代码如下: NSString *path = @"/Users/android_ls/Desktop/city_province.json"; NSArray *array = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:path] options:NSJSONReadingMutab

  • IOS json 解析遇到错误问题解决办法

    概要: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn't be completed. (Cocoa error 3840.)" (Unescaped control character around character 1419.) UserInfo=0x1563cdd0 {NSDebugDescription=Unescaped control character around character 14

  • IOS 开发之NSDictionary转换成JSON字符串

    IOS 开发之NSDictionary转换成JSON字符串 普通情况下,你可能会用一个NSDictionary的分类去做NSDictionary转JSON,如下代码: NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error]; if (! jsonData) { return @"{}&qu

  • IOS用AFN发送字符串形式的Json数据给服务器实例

    每个人遇到后台的需求不一样,我只能写出自己目前遇到的需求和做法,我的后台是需要一个Json的key,对应一个字符串类型的字典,后台要求的是带双引号和冒号的字典,所以就拼接了一下 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 发送post请求 // manager.responseSerializer = [AFJSONResponseSerializer serializer]; manager.respon

  • IOS中Json解析实例方法详解(四种方法)

    作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou

  • IOS 简单的本地json格式文件解析的实例详解

    IOS 简单的本地json格式文件解析的实例详解 ljweibo.json文件 { "data":[{ "name" : "孙悟空", "content" : "7月12日的国务院常务会议上,李克强明确要求,要将已审议的<快递条例(草案)>向社会公开征求意见.在会上,总理说了这么一段话:"几年前,快递业刚刚开始发展的时候,有些城市不允许快递存在,理由是影响市容整洁,快递员骑的摩的也不允许停放.但

  • iOS json解析出错的几种情况总结

    iOS json解析出错 对于json格式,我们并不陌生,但是因为它处于不同的语言标准也不一致.分享一下最近项目出现的json问题: 1.编码问题,在不清楚服务端的编码格式的情况下,我直接使用: NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]; NSError *error = nil; NSArray *arr = [NSJSONSerialization JSONObjectWithD

  • iOS开发使用JSON解析网络数据

    前言:对服务器请求之后,返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 本篇随便先讲解JSON解析. 正文: 关于JSON: JSON是一种轻量级的数据格式,一般用于数据交互JSON的格式很像Objective-C中的字典和数组:{"name":"jack","age":10} 补充: 标准的JSON格式的注意点:key必须用双引号.(但是在Java中是单引号) JSON-OC的转换对照表 其中:null--返回OC里的N

  • iOS开发使用XML解析网络数据

    前言:本篇随笔介绍的是XML解析. 正文: 1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件 2.IOS中XML解析方案有很多种: 2-1.第三方框架: libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX解析 GDataXML:DOM方式解析,由Google开发,基于libxml2 2-2.苹果原生 NSXMLParser:SAX方式解析,使用简单

  • Python操作JSON实现网络数据交换

    目录 前言 JSON是什么? JSON与XML的优劣差异? 将Python对象编码成JSON字符串 将JSON字符串解码为Python对象 解决中文乱码问题 前言 学学Python中操纵JSON的知识.学完本文,你可以学到如下内容: 1.JSON是什么? 2.JSON与XML的优劣差异? 3.将Python对象编码成JSON字符串 4.将JSON字符串解码为Python对象 5.解决JSON中文乱码问题 JSON是什么? JSON的全称是 JavaScript Object Notation,是

  • iOS开发中不合法的网络请求地址如何解决

    NSString *const kWebsite = @http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fr=&sf=1&fmq=1459502303089_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&

  • newtonsoft.json解析天气数据出错解决方法

    今天用NewtonSoft.JSon解析一个天气数据,数据格式如: 复制代码 代码如下: {"status":1,"detail":"\u6570\u636e\u83b7\u53d6\u6210\u529f","data":[[{"date":"2014-01-01","dis_id":"1119","dis_name":&qu

  • iOS开发使用GDataXML框架解析网络数据

    前言:GDataXML是google基于C语言写的第三方框架,该源码文件就一个类,看其源码,基本使用了C语言的底层的很多lib编译库代码,所以刚导入使用,会报错提示需要设置导入需要的链接库. 另外,该第三方框架并没有纳入Cocoapods,所以通过pod搜索不到这个框架. 1.使用GDataXML框架,将GDataXML框架导入到工程中.下载链接:http://xiazai.jb51.net/201602/yuanma/GDataXML(jb51.net).zip.然后先编译一下,会有错误提示,

  • 谈谈iOS开发之JSON格式数据的生成与解析

    本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? JSON格式取代了xml给网络传输带来了很大的便利,但是却没有了xml的一目了然,尤其是json数据很长的时候,我们会陷入繁琐复杂的数据节点查找中.这时我们就需要一款在线校验工具 BeJson. 一.JSON是什么? JSON(JavaScript Object Notation) 是一种轻量级的数

  • iOS开发系列--详细介绍数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储,包括偏好设置其本质都是存储为文件,只是说归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录.当然,文件存储并不作为本文的重点内容.本文重点还是说数据库存储,做过数据库开发的朋友应该知道,可以通过SQL直接访问数据库,也可以

随机推荐