JSON和XML数据解析

JSON

1.JSON是一种轻量级的数据格式,一般都是用于数据交互
2.服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
3.JSON的格式很像OC中的字典和数组
{"name" : ["jim","jack","rose"] ,"age" : 10}
标准的JSON格式注意点:key必须用双引号
4.想要从JSON中挖掘数据,就得对JSON进行解析
JSON--->OC数据类型


Snip20150930_17.png

5.对于JSON数据的解析,我们推荐用苹果原生:NSJSONSerialization(性能最好)

常用方法有:

JSON--->OC对象[我们称之为JSON数据序列化--一般转化成OC中的字典,或者数组. 具体根据传入的JSON数剧算]
+ (id)JSONObjectWithData:() options:(NSJSONReadingOptions)opt error:(NSError **)error

OC对象--->JSON数据[我们称之为JSON数据的反序列化--也就是将数据转换为JSON数据]
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError *)error

序列化
 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        // 将相应数据data ,转换成json数据。
        // 第一个参数: 需要转换的data
        // 第二个参数:关于 数据显示后的一些配置
        /*
         NSJSONReadingMutableContainers = (1UL << 0),解析出来的数组和字典是可变的(可变容器)
         NSJSONReadingMutableLeaves = (1UL << 1),    解析出来的字符串是可变的(ios7 以前用的)
         NSJSONReadingAllowFragments = (1UL << 2)    被解析的数据 既不是字典 也不是字符串的时候
         NSNumber,NSBOOLen NSNULL(对象,用于占位的),nil(0)
         */
        
        
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding ];
      NSData *json = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error:nil];
    
        NSLog(@"%@-----%@",str,json);
    }];

#######反序列化

NSDictionary *dict = @{
                           
                           @"name":@"小明",
                           @"age":@16,
                           @"schools":@[
                                        @{@"小学":@"123"},
                                        @{@"初中":@"456"},
                                        @{@"大学":@"789"}
                                      ],
                           };
    // 对象转换成 json ,
    // 第一个参数:传入需要转换的对象
    // 对象转换以后的排版方式,没什么意义
    
     NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:nil];
    NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

为了让序列化出来出来的数组,在控制台的打印清晰明了,于是重写了[NSDictionary,NSArray加分类, 然而可以直接写在一个.m文件中, 只是按照分类写法就行了, 一个文件中允许有两个@implementation ,但是不能嵌入式使用. 重写的方法在调用 NSLog时 会自动调用, 这个方法就是为了格式固定的,以及调试使用] - (NSString *)descriptionWithLocale:(id)locale
- (NSString *)descriptionWithLocale:(id)locale

#import <Foundation/Foundation.h>

@implementation NSDictionary (LXL)

- (NSString *)descriptionWithLocale:(id)locale
{
    // 1.定义字符串保存的拼接结果。
    NSMutableString *strMut = [NSMutableString string];
    [strMut appendString:@"{\n"];
    
    [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
       
        [strMut appendFormat:@"\t%@:%@\n",key,obj];
        
    }];
     [strMut appendString:@"}\n"];
    return strMut;
 
}

@end

@implementation NSArray (LXL)

- (NSString *)descriptionWithLocale:(id)locale
{
    // 1.定义字符串保存的拼接结果。
    NSMutableString *strMut = [NSMutableString string];
    [strMut appendString:@"(\n"];
    
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [strMut appendFormat:@"%@\n",obj];
    }];
    [strMut appendString:@")\n"];
    return strMut;
}
@end

在项目中一般介绍到的JSON数据,都是将其转换成模型数据进行保存, 更有方便的方法,就是将其转换成plist文件保存在文件沙盒中, 方便读取. (这是关于文件的持久化的管理)

Snip20151001_1.png

XML

基本介绍

1.全称:Extension Markup Language : 可扩展标记语言
2.交互数据格式 html语言 DOM标签组成
3.组成部分: 文档声明[相当于Html中的header], 元素
(Element),属性(Attribute)

解析方式:

DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合大文件的解析

iOS中的XML解析

解析方式: NSXMLParser(大小),使用方便 ,
三方框架GDataXML(小)

下面来介绍GDataXML的使用

1.GDataXML基于libxml2库, 必须导入libxml2库(添加依赖库)
2.因为GDataXML是非ARC,所以需要混编 ,混编方法


Snip20151001_2.png

GDataXML中的常用类

1.GDataXMLDocument:带便整个XML文档
2.GDataXMLElement:代表文档中的每一个元素
使用attributeForName:方法可以获取属性值

 NSString *urlStr = @"http://120.25.226.186:32812/video?type=XML";
    NSURL *url = [NSURL URLWithString:urlStr];
// 设置请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 发送异步请求,获取服务器数据
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        // 将接收到的数据转换为 xml文件
         GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
        // 获取文档中的每一个元素(外层)
          GDataXMLElement *element = document.rootElement;
        // 打印验证所有元素
        NSLog(@"%@",element);
        // 获取 元素中的内容 (内层元素)
        NSArray *elements = [element elementsForName:@"video"];
        for (GDataXMLElement *element in elements) {
     
            VideoModel *model = [[VideoModel alloc]init];
            // 取出每一个子元素中的属性, 再给模型赋值保存数据
            model.name =  [element attributeForName:@"name"].stringValue;
            model.url = [element attributeForName:@"url"].stringValue;
            model.image = [element attributeForName:@"image"].stringValue;
            model.length = [element attributeForName:@"length"].stringValue.intValue;
            [self.videos addObject:model]; 
            [self.tableView reloadData];
            
        }
    }];
下面来介绍NSXMLParser的使用

使用步骤

1.传入XML数据,创建解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:Data]
2.设置代理,监听解析过程
parser.delegate = self
3.开始解析
[parser parse]

NSXMLParser采用的是SAX方式解析,特点是事件驱动,下面情况都会通知代理

1.当扫描到文档Document的开始与结束
2.当扫描到元素Element的开始和结束

NSXMLParserDelegate的代理方法

1.当扫描到文档的开始时调用(开始解析)
- (void)parserDidStartDocument:(NSXMLParser *)parser
2.当扫描到文档的结束时调用(解析完毕)
- (void)parserDidEndDocument:(NSXMLParser *)parser
3.当扫描到元素开始时调用(attributeDict存放着元素的属性)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) nsmespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
4.当扫描到元素的结束时调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName (NSString *)qName
在实际应用中的使用方法:

// 将解析的每一元素,进行转换,存储,可以存储在plist文件中,也可以保存在模型数据中
// 开始解析xml中的每一个元素,从大到小
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    
    // 将解析到的字典属性, 进行模型转换
    VideoModel *model = [VideoModel objectWithKeyValues:attributeDict];
    // 将模型添加到模型数组
    [self.videos addObject:model];
    // 每添加一组,进行数据更新
    [self.tableView reloadData];


}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容