XML、JSON

1. JSON

JSON是网络上用来传输数据使用最广泛的数据格式;JSON是Javascript的子集,专门负责描述数据格式(Javascript是做网页开发使用的一种"脚本"语言,Javascript和Java没有任何关系!)

比XML更轻量级

1.1 语法规则

(1)数据以键值对(key/value)方式表示

(2)数据由逗号分隔

(3)花括号保存对象

(4)方括号保存数组

JSON描述对象的语法格式很像字典,但不是字典,仅仅是键值对的形式很像;

JSON表示单个对象:(字典里有@JSON中没有@

1.2 JSON值

(1)数字(整型、浮点型)

(2)字符串

(3)逻辑值(true或false)

(4)数组、对象

(5)null

序列化:在向服务器发送数据之前,将 NSArray / NSDictionary 转换成二进制的过程

反序列化:在从服务器接收到数据之后,将二进制数据转换成 NSArray / NSDictionary

1.3 数据解析(反序列化)

从服务器获取到的数据都是二进制数据,客户端无法直接使用,需要将二进制的数据转换为 客户端可以直接使用的OC对象

(1)苹果原生

NSJSONSerialization类

id result = [NSJSONSerialization JSONObjectWithData: options: error:];

NSLog(@"%@", [result class]);

<1>如果打印json类型的结果是_NSCFDictionary,表示字典(不可变的);

      NSJSONSerialization 自动将二进制形式的JSON字符串,解析成了字典或数组;

     JSON解析返回的对象是字典数组,是根据原始数据是由{}或者[]括起来决定的。

<2>optins选项

NSJSONReadingMutableContainers = (1UL << 0) ---> 容器可变

NSJSONReadingMutableLeaves = (1UL << 1) ---> 叶子可变

NSJSONReadingAllowFragments = (1UL << 2) ---> 顶级节点可以不是 NSArray 或者 NSDictionary

通常options参数我们都填  0(默认不可变),表示任何附加操作都不做,效率最高!

这种错误表示JSON文件有错:

(2)JSONKit(MRC下的)

JSONKit已经在2012年停止更新,适用于 IOS  5.0  (原生的是在 5.0 开始有的)以前的版本开发使用

JSONKit反序列化核心代码:

id result = [[JSONDecoder decoder] objectWithData:data];

 

2. XML(可扩展标记语言)

XML被设计用来传输和存储数据;有且只有一个根节点;开始结点必须对应结束结点 

2.1 解析方式

(1)DOM

是在 MAC 使用的解析方式;内存消耗极大,不适用于手机;iPhone无法直接使用 DOM 方式解析 XML

(2)SAX

是只读的方式,从上向下的方式解析;是苹果提供的解析方式;NSXMLParser 通过代理实现解析;速度快

解析步骤:

  1. 开始文档 - 准备工作
  2. 开始"节点"
  3. 发现节点内部的内容,每一个节点,可能需要多次才能找完
  4. 结束"节点"
  5. 结束文档 - 解析结束

例子:

 

- (void)viewDidLoad {

    [super viewDidLoad];

   //1.URL

    NSURL *url = [NSURL URLWithString:@"http://192.168.34.36/videos.xml"];

    //2.NSURLRequest

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:30];  

    //3.建立连接,发送请求

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

        //4.得到服务器的响应数据,进行处理

        if (connectionError==nil &&data!=nil &&data.length>0) {

            //1.xml里面需要先搞一个xml解析器

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

            //2.给我们的解析器设置代理

            parser.delegate = self;

            //3.开始解析

            [parser parse];

        }

    }];

}

// 实现代理方法,开始解析

// 文档开始

- (void)parserDidStartDocument:(NSXMLParser *)parser{

    NSLog(@"----开始文档---");

}

// 开始某个标签

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{

        NSLog(@"start  %@---",elementName);

}

// 当我们解析到内容的时候,把他多次打印的值,拼接字符串,可变字符串

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    NSLog(@"%@",string);

}

// 结束某个标签

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{

    NSLog(@"end  %@---",elementName);

}

// 文档结束

- (void)parserDidEndDocument:(NSXMLParser *)parser{

    NSLog(@"----结束文档---");

}

 

3. JSON和XML的区别

(1)JSON和XML的数据可读性基本相同

(2)XML有很好的可扩展性,JSON也有可扩展性

(3)XML的解析需要考虑父节点,子节点;JSON解析不需要考虑这些

(4)现在很多情况JSON解析用得比较多

(5)JSON的数据体积相对于XML会小一些

posted @ 2016-08-30 22:22  简简单单0  阅读(509)  评论(0编辑  收藏  举报