JSON/XML解析以及加密
关于响应数据的思考
服务器给我们返回的数据需要有一定的格式,使用一种结构将数据组织起来,方便传输和使用
之前返回数据格式
2+登录成功
获取好友,每个好友包含名字、年龄、性别、地址
李四+18+男+朝阳区
拉取好友列表
李四+18+男+朝阳区#
李四+18+男+朝阳区#
李四+18+男+朝阳区
如果拉取的好友列表中有好友的好友列表呢
可能就需要很多个符号了
在数据中间加符号其实就是为了让我们的数据变得更有格式,有条理,方便服务器和客户端进行交流
JSON
JSON简介
JSON数据传输格式
:全称JavaScript Object Notation
,是基于javascript
的轻量级的数据交换格式
JSON值类型
JSON中数据类型 对应 OC中类型
数字(整数或浮点数) NSNumber
字符串(在双引号中) ""
逻辑值(true 或 false)NSNumber
数组(在方括号中) NSArray
对象(字典 在花括号中) NSDictionary
null [NSNull null] 注意在判断值是否为空时使用此种方式
JSON语法
JSON 语法是JavaScript对象表示语法的子集。
数据在 名称/值 对中 (键值对)
数据由逗号分隔 ,
花括号表示对象(OC中的字典){}
方括号表示数组 []
JSON 名称/值对 (键值对)
键/值对组合中的名称(键)写在前面(在双引号中),值写在后面(可以是JSON值支持的数据类型),中间用冒号隔开:
{"girlfriends" : [{"name":"林志玲", "age":"18"}, {"name":"林志颖", "age":"28"}, {"name":"林志炫", "age":"38"}, {"name":"阿莲", "age":"16"}], "girlfriendscount": 4}
JSON解析
NSJSONSerialization类
JSON转字典
JSON转字典
字典转JSON
字典转JSON
解析注意事项
NULL
nil
Nil
NSNull
的区别:
NULL C语言中的 表示空指针
nil OC中的 空指针 一般用于对象的空
Nil OC中的 空指针 一般用于类的空
NSNull 空类 该类创建的对象为空对象 表示占位 对象中什么也没有
工具网站
在线校验json格式
http://json.parser.online.fr
http://www.json.cn
XML
XML简介
XML数据传输格式
XML 全称Extensive Markup Language 可扩展标记语言
可扩展标记语言是一种很像超文本标记语言的标记语言。它的设计宗旨是传输数据,而不是显示数据(HTML)。它的标签没有被预定义,您需要自行定义标签。例如
<age>123</age>
<name>小明</name>
它被设计用来传输(XML格式的数据)和存储数据(XML文件),其焦点是数据的内容。
超文本标记语言被设计用来显示数据,其焦点是数据的外观。
超文本标记语言旨在显示信息,而XML旨在传输信息。
XML范例
<friends>
<friend>
<name>小明</name>
<age>18</age>
<location>北京</location>
</friend>
<friend>
<name>小明2</name>
<age>19</age>
<location>上海</location>
</friend>
<friend>
<name>小明3</name>
<age>20</age>
<location>广州</location>
</friend>
</friends>
XML解析
把XML标签中内容取出来的过程 我们就称为解析
XML解析分为两种方式:SAX、DOM
SAX解析
SAX解析方式:它是事件驱动模型,解析XML文档时从开始每遇到一个开始或者结束标签、属性或者一条指令时,解析器就产生一个事件进行相应的处理,一边读取XML文档一边处理,不必等整个文档加载完才采取措施,当在读取解析过程中遇到需要处理的对象,会发出通知进行处理
iOS中系统类使用的是SAX解析方式
- 创建解析器 NSXMLParser
- 设置代理 NSXMLParserDelegate
- 开始解析文档
- 碰到开始标签
- 找到标签内容
- 遇到结束标签
- 解析结束
- 解析遇到错误 停止解析
- 开始解析 parse
注意事项
1、解析需要一个可变字符串 该字符串Property描述为属性时不要copy
2、在解析代理方法 发现标签中的内容 要将标签中的内容追加在可变字符串后
3、将可变字符串内容置为空 不可以用self.mutableString = @“” 使用其他两种方式
新建对象 self.mutableString = [NSMutableString string];
将可变字符串内容置为空[self.mutableString setString:@“”];4、使用model类保存数据 该model的string属性要用copy 因为NSString有可变子类
SAX解析的封装
- 构建父类、重新整理代码结构
- 将XML解析代码抽离出来,构建一个类YKUserXMLParser
- 抽象出父类,将共有的部分抽离出来,写到父类中
- 使用KVC赋值
DOM解析
DOM解析方式:它必须一次性读入整个XML文档,完成DOM树的构造,在处理规模较大的XML文档时就很耗内存,占用资源较多,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。
第三方库:GDataXML
使用步骤:
- 从http://code.google.com/p/gdata-objectivec-client/downloads/list下载“gdata-objective-c client library.”
- 解压缩文件,找到Source\XMLSupport,并且将其中的GDataXMLNode.h 和 GDataXMLNode.m文件拖到项目中
- 在需要调用GDataXML的代码文件头部,加入:import “GDataXMLNode.h”
- 选中项目,选中“Build Settings”标签页,将Build Settings页中,顶部的“Basic”标签切换到“All”,找到“Paths\Header Search Paths”项,并添加“/usr/include/libxml2”到列表中
- 注意GDataXML只能在非ARC环境下使用,如果在ARC的工程中需要添加标记-fno-objc-arc
- 找到“Linking\Other Linker Flags”项,并添加“-lxml2”到列表中
库中主要有3个类
GDataXMLDocument XML文档对象
GDataXMLElement 元素、即标签
GDataXMLNode 属性
- 根据data构建XML文档对象
- 获取XML文档的根节点
- 取出所有user标签
- 遍历user数组,分别取出user中的标签
加密
Base64
Base64加密实际采用的Base64编码具有不可读性的特性,但严谨角度来说它不算加密,
它是可逆的
MD5
MD5,又名摘要算法,哈希算法
其实MD5是不可逆的 但也不是绝对安全的 是可以解密成功的
使用以下方案
-
加密过后的字符串前后各加一段字符串
原字符串:abc 加密后MD5:132sdfsflfjlsf123
-
对加密后的字符串进行一些其他操作
原字符串:abc 加密后MD5:sdfsflfjlsf
例如1、将加密后字符串中的m全部替换成d
2、将前几位和后几位对调