什么是JSON ?
一:JSON是一种轻量级的数据交换格式,作用于数据交互,目前80%的开发都使用JSON格式,原因是它体积小,解析方便相比XML就很明显了
二: 从服务器返回给客户端的数据一般是JSON或XML格式(文件下载除外)
三: JSON的格式很像OC中的字典
A: {"name":"剑圣","area":@"广东7","lv":"70"}
B: {"skill":["幻影剑舞","拔刀斩","银光落刃"]}
C: {"name":"剑圣","area":@"广东7","lv":"70","skill":["幻影剑舞","拔刀斩","银光落刃"]}
JSON标准格式注意点:key必须是双引号("")
四: 想要从服务器返回的json数据中挖掘对应的数据需要对JSON进行解析,将JSON转为OC
下面是一条URL它将返回JSON格式的数据
URL:点击打开链接
返回内容
看起来是不是给人一种眼花缭乱的感觉!!其实它是很有规律的,直接把返回的内容Copy然后利用在线解析JSON格式的网站进行格式排版
五: JSON的常见解析方案
在IOS中,JSON的常见解析方案有4种方式
A: 第三方框架:JSONKit、SBJson、TouchJSON (性能从左到右越差)
B: 苹果自带原声框架:NSJSONSerialization (它的性能最好)
NSJSONSerialization 常见使用方法
+ (id)JSONObjectWithData:(NSData*)data options:(NSJSONReadingOptions)opterror:(NSError**)error;
+ (NSData *)dataWithJSONObject:(id)objoptions:(NSJSONWritingOptions)opterror:(NSError**)error;
实例代码- (IBAction)analysisJson:(id)sender {
// json路径
NSURL* url = [NSURL URLWithString:@"http://interface.xyzs.com/v2/ios/c02/homepage?p=1×tamp=1452758014&sign=4afa6390e278c7033844d7e7657a414e&devicetype=1&systemversion=9.0.2&deviceimei=2CE838A3-D6CA-423E-AC08-03F31A9159CB&jailbreak=2&clienttype=1&clientversion=4.1.0&channel=500389&identity=33&nettype=WiFi&lang=zh-Hans-CN&sn=2CE838A3-D6CA-423E-AC08-03F31A9159CB&idfa=2CE838A3-D6CA-423E-AC08-03F31A9159CB&certId=33&idfv=AEFFBDE7-FDCC-479C-898F-919EA9820D4B&uuid=EEB6E4FF-A3C3-4ECF-ADC2-B6412AFB1453&showModel=iphone_4&isauthor=2&uid=-1&ipatype=1&device_uuid=Unknow&appleid=&clientip=&hlaccount="];
// 任务
NSURLSession* session = [NSURLSession sharedSession];
NSURLSessionDataTask* task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data==nil||error)
{
NSLog(@"访问有误");
return;
}
//解析Json
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
// 手动解析
NSDictionary* datas = dic[@"data"];
NSArray* banner = datas[@"banner"];
NSString* image = banner[0][@"img"];
NSString* title = banner[0][@"title"];
// 图片下载
NSURL* downUrl = [NSURL URLWithString:image];
NSData* ImageData = [NSData dataWithContentsOfURL:downUrl];
// 返回主线程刷新
dispatch_async(dispatch_get_main_queue(), ^{
if (ImageData)
{
self.imageView.image = [UIImage imageWithData:ImageData];
self.titleView.text = title;
}
});
}];
[task resume];
}
XML
XML全称:ExtensibleMarkup Language 也叫做:"可扩展标记语言"
跟JSON一样,也是常用于一种数据的交互方式 ,也叫做XML文档
现在的网络应用中的数据解析无论是Android还是IOS平台,大多数都是使用JSON解析,XML开始渐渐衰弱,
因为XML体积大,格式也不好解析,相比JSON就简化了很多。
XML举例
上面是服务器返回的XML格式数据: 中国天气网接口返回XML
<china>
<city name="上海"stateDetailed="晴"/>
<cityname="北京"stateDetailed="霾转小雪"/>
<cityname="广州"stateDetailed="小雨"/>
</china>
一个常见的XML文档一般由以下部分组成
1. 文档声明
2. 元素
3 属性
<?xml version="1.0"?>
<?xml version="1.0"encoding="UTF-8"?>
XML - 元素一个元素包括了开始标签和结束标签
拥有元素的内容:<city>广州</city>
没有元素的内容:<city></city>
下面将介绍怎么提取city元素中的quName 和 stateDetalied 属性值
XML的解析方式有两种
DOM: 一次性将整个XML文档载入内存,比较适合解析小文件
SAX: 从根元素开始按顺序一个一个元素往下解析,比较适合大文件解析
IOS中解析XML的手段有很多
一 :苹果原生
NSXMLParser :SAX方式解析,使用简单
二: 第三方框架
NSXMLParser 例
// 传入XML数据,创建解析器
NSXMLParser*parser = [[NSXMLParseralloc] initWithData:data];
// 设置代理,监听解析过程
parser.delegate = self;
// 开始解析
[parser parse];
代理:NSXMLParserDelegate
- (void)parserDidStartDocument:(NSXMLParser*)parser
- (void)parserDidEndDocument:(NSXMLParser*)parser
- (void)parser:(NSXMLParser*)parser didStartElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qNameattributes:(NSDictionary *)attributeDict
- (void)parser:(NSXMLParser*)parser didEndElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName
<span style="font-size:14px;">// 当扫描到元素的开始时调用(attributeDict存放着元素的属性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// 判断 元素
if ([elementName isEqualToString:@"city"])
{
// 地区
NSString* name = attributeDict[@"quName"];
// 天气
NSString* stateDetailed = attributeDict[@"stateDetailed"];
NSLog(@"%@ %@",name,stateDetailed);
}
}
- (IBAction)analysisXML:(id)sender
{
// xml路径
NSURL* url = [NSURL URLWithString:@"http://flash.weather.com.cn/wmaps/xml/china.xml"];
// 创建任务
NSURLSession* session = [NSURLSession sharedSession];
NSURLSessionDataTask* task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// 主线程解析JSON
dispatch_async(dispatch_get_main_queue(), ^{
NSXMLParser* xmls = [[NSXMLParser alloc] initWithData:data];
xmls.delegate = self;
[xmls parse];
});
}];
// 执行
[task resume];
}</span>