OC中的JSON和XML的解析方案

JSON解析

什么是JSON

  • JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
  • 易于人阅读和编写。同时也易于机器解析和生成
  • 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
  • JSON的格式很像OC中的字典和数组
    例子:

{"name" : "xxm", "age" : 27}
{"names" : ["Simon", "linda", "kimi"]}

  • 标准JSON格式key必须是双引号""

JSON与OC 转换对照表

JSON OC
大括号 { } NSDictionary
中括号[ ] NSArray
双引号 " " NSString
数字 6、6.6 NSNumber
true、flase NSNumber
null NSNull

iOS中的JSON的解析方案

在iOS中,JSON的常见解析方案

  • 第三方框架:JSONKit、SBJson、TouchJSON

NSJSONSerialization

  • 苹果原生(推荐使用):NSJSONSerialization(性能最好)

解析JSON

NSJSONSerialization的常见方法

  • JSON数据 ->OC对象

    + (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
    
    • NSJSONReadingOptions
      • NSJSONReadingMutableContainers 解析出来的NSDictionaryNSArray是可变的
      • NSJSONReadingMutableLeaves 解析出来的对象中的NSString是可变的, 不推荐使用。(解析不出来。)
      • NSJSONReadingAllowFragments 被解析的JSON数据的top-level 如果既不是NSDictionary也不是NSArray, 需使用该值.
      • 默认值0orkNilOptions
    • 编码
      JSON规范中列出的5种支持的编码之一:UTF-8UTF-16LEUTF-16BEUTF-32LEUTF-32BE
      最有效的是UTF-8
  • OC对象->JSON对象

     + (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)erro
    
    • + (BOOL)isValidJSONObject:(id)obj
      判断当前OC对象能否转换为JSON数据
      具体限制:

      • obj是NSArrayNSDictionay 以及他们派生出来的子类
      • obj 包含的所有对象是NSString,NSNumber,NSArray,NSDictionaryNSNull
      • 字典中所有的key必须是NSString类型的
      • NSNumber的对象不能是NaN或无穷大
    • NSJSONWritingOptions

      • NSJSONWritingPrettyPrinted 漂亮的排版。对转换之后的JSON对象进行排版
      • NSJSONWritingSortedKeys ios 11.0 之后使用,会对生成的数据,按照key的字母大小进行排序。数据一行显示.
      • 默认值 0or kNilOptions 数据一行显示

字典转模型

常用第三方框架

  • Mantle 需要继承自MTModel
  • JSONModel 需要继承自JSONModel
  • MJExtension 不需要继承,无代码侵入性
  • YYModel不需要继承,无代码侵入性、高性能

自己设计和选择框架时需要注意的问题

  • 侵入性
  • 易用性,是否容易上手
  • 扩展性,很容易给这个框架增加新的功能

XML的解析

什么是XML

  • XML全称是Extensible Markup Language,译作“可扩展标记语言”
  • 交互的数据格式
  • 一般也叫XML文档(XML Document)

XML语法

一个常见的XML文档一般由以下部分组成

  • 文档声明
  • 元素(Element)
  • 属性(Attribute)

注意不能交叉包含、空行换行、XML文档只能有一个根元素等

XML语法 – 文档声明

在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型
最简单的声明

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

XML语法 – 元素(Element)

  • 一个元素包括了开始标签和结束标签
    • 拥有内容的元素:< name >菜式菜品
    • 没有内容的元素:< name >
    • 没有内容的元素简写:< name/>
  • 一个元素可以嵌套若干个子元素(不能出现交叉嵌套)
  • 规范的XML文档最多只有1个根元素,其他元素都是根元素的子孙元素

XML语法 –元素的注意

  • XML中的所有空格和换行,都会当做具体内容处理

  • 下面两个元素的内容是不一样的

    (一)< name >菜式菜品
    (二)< name >
              菜式菜品
         
    

XML语法 – 属性(Attribute)

  • 一个元素可以拥有多个属性

    list元素拥有nameid两个属性
    属性值必须用 双引号"" 或者 单引号'' 括住

  • 属性表示的信息也可以用子元素来表示,比如

    < list >
      < name >菜式菜品
          1
    
    

解析XML

XML的解析方式有2种

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

iOS中的XML的解析方案

  • 苹果原生
    NSXMLParser:使用SAX方式解析,使用简单
  • 第三方框架
    • libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析
    • GDataXML:DOM方式解析,由Google开发,基于libxml2

NSXMLParser

使用NSXMLParser解析XML步骤和代理方法

  • 解析步骤:
    • 创建一个解析器
      NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    • 设置代理NSXMLParserDelegate
      parser.delegate = self;
    • 开始解析
      [parser parse];
    • 实现 NSXMLParserDelegate代理方法
  • NSXMLParser采取的是SAX方式解析,以下事件会通知代理
    • 当扫描到文档(Document)的开始与结束
    • 当扫描到元素(Element)的开始与结束

GDataXML配置

GDataXML基于libxml2库,得做以下配置

  • 导入libxml2库

  • 设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)
    在Header Search Path中加入/usr/include/libxml2

  • 设置链接参数(自动链接libxml2库)
    在Other Linker Flags中加入-lxml2

  • 由于GDataXML是非ARC的,因此得设置编译参数


    image.png

GDataXML的使用

GDataXML中常用的类
GDataXMLDocument:代表整个XML文档
elementsForName:获得元素GDataXMLElement
GDataXMLElement:代表文档中的每个元素
attributeForName:获得属性值

具体代码查看Github项目

Github地址:iOSMultiTechnology

你可能感兴趣的:(OC中的JSON和XML的解析方案)