IOS网络篇:JSON和XML的解析

 什么是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在线解析 解析后内容



五: JSON的常见解析方案


在IOS中,JSON的常见解析方案有4种方式

A: 第三方框架:JSONKit、SBJson、TouchJSON (性能从左到右越差)

B: 苹果自带原声框架:NSJSONSerialization (它的性能最好)

NSJSONSerialization 常见使用方法

JSON 数据 OC 对象

+ (id)JSONObjectWithData:(NSData*)data options:(NSJSONReadingOptions)opterror:(NSError**)error;

OC 对象 J SON 数据

+ (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 文档的最前面,必须编写一个文档声明,用来声明 XML 文档的类型
最简单的声明

<?xml version="1.0"?>

encoding 属性说明文档的字符编码

<?xml version="1.0"encoding="UTF-8"?>

XML - 元素

一个元素包括了开始标签和结束标签

拥有元素的内容:<city>广州</city>

没有元素的内容:<city></city>


规范的 XML 文档最多只有 1 个根元素,其他元素都是根元素的子孙元素
一个元素可以拥有多个属性

<city quName="黑龙江" pyName="heilongjiang" cityname="哈尔滨" state1="0" state2="0" stateDetailed="晴" tem1="-17" tem2="-31" windState="西风小于3级"/>

city素拥有 9个属性
属性值必须用 双引号""或者 单引号' '括住

    XML 解析

下面将介绍怎么提取city元素中的quName 和 stateDetalied 属性值
XML的解析方式有两种

DOM: 一次性将整个XML文档载入内存,比较适合解析小文件

SAX:  从根元素开始按顺序一个一个元素往下解析,比较适合大文件解析

IOS中解析XML的手段有很多

一 :苹果原生

NSXMLParser :SAX方式解析,使用简单

二: 第三方框架

libxml2 :纯 C 语言,默认包含在 iOS SDK 中,同时支持 DOM SAX 方式解析

GDataXML DOM 方式解析,由 Google 开发 基于 libxml2

XML 解析方式的选择建议

大文件: NSXMLParser libxml2

小文件: GDataXML

NSXMLParser

使用步骤

// 传入XML数据,创建解析器

NSXMLParser*parser = [[NSXMLParseralloc] initWithData:data];

// 设置代理,监听解析过程

parser.delegate = self;

// 开始解析

[parser parse];

NSXMLParser 采取的是 SAX 方式解析,特点是事件驱动,下面情况都会通知代理
当扫描到文档( Document )的开始与结束
当扫描到元素( Element )的开始与结束

代理:NSXMLParserDelegate
当扫描到文档的开始时调用(开始解析)

- (void)parserDidStartDocument:(NSXMLParser*)parser

当扫描到文档的结束时调用(解析完毕)

- (void)parserDidEndDocument:(NSXMLParser*)parser

当扫描到元素的开始时调用( attributeDict 存放着元素的属性)

- (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>




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值