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会小一些

时间: 2024-10-29 19:12:03

XML、JSON的相关文章

C#.NET序列化XML、JSON、二进制微软自带DLL与newtonsoft(json.net)

序列化是将对象转换成另一种格式(XML.json.二进制byte[]) JSON序列化 .NET中有三种常用的JSON序列化的类,分别是: Newtonsoft.Json.JsonConvert类(推荐) Newtonsoft.Json.JsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是:http://www.codeplex.com/json/),它提供了更灵活的序列化和反序列化控制,并且如果你的开发环境使用的是.NET Framework3.5及以后

IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSXMLJSONSQLiteCoreData 一.文件操作 1.因为应用是在沙盒(Sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件: * Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 * tmp:存放临时文件,iTunes不会备份和恢复

C# 二进制、Xml、Json序列化和反序列化

昨天利用业余时间对比了下C#中三种序列化方式(二进制.Xml.Json),综合来看json方式生成的字节数组长度最短,但当你需要序列化的对象中包括byte[]类型,且其长度较长时,序列化后,xml方式的长度较json方式更短.xml方式中对byte[]做了base64转换. 最后综合三种情况,写了一个基于泛型的通用类来完成序列化和反序列化操作,仅供参考,若有什么错误之处,还请指教. using System; using System.Collections.Generic; using Sys

kettle(PDI)解析xml、json等格式数据的方法

最近由于工作业务需要,一直在研究pdi工具中解析xml.json等格式数据的方法,解析xml和json都较简单. 解析xml的时候,只需要选择相应的文件(不一定要是xml文件,txt的也行,只要是数据是xml格式就可以),然后选择循环读取路径,设置好标签对名称即可: 一:选择文件,如果xml数据是上一过程输入的,不用选择文件: 二:选择循环解析xml的节点,你所选择的节点应该是所以数据的根节点: 三:设置好对应的节点名称和数据名称: 保存配置后,运行即可. 对应的解析json也类似xml的解析:

10分钟掌握XML、JSON及其解析

引言 NOKIA 有句著名的广告语:“科技以人为本”.任何技术都是为了满足人的生产生活需要而产生的.具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角.不过个人一直认为基本的技术和思想是放之四海而皆准的,许多技术未必需要我们从头到尾再研究一遍,我们要做的就是站在巨人的肩膀上,利用其成果来为人们的需求服务. 随着移动互联网时代的大潮,越来越多的App不光是需要和网络服务器进行数据传输和交互,也需要和其他 App 进行数据传递.承担App与网

XML、JSON、PB比较

最近公司要把原来的项目从php生成xml该成用python生成pb(Protocol Buffer)结构,以前没接触pb,从网上查了一下教程.感觉不错. 我现在来总结一下: XML JSON PB 数据结构支持 复杂结构 简单结构 复杂结构 数据保存方式 文本 文本 二进制 数据保存大小 大 一般 小 解析效率 慢 一般 快 语言支持程度 非常多 多 C++/Java/Python/golang 开发难度?繁琐? 繁琐 简单 简单 学习成本 低 低 低 适用范围 数据交换 数据交换 数据交换 读

Ajax返回值之XML、json类型

Ajax返回值之XML.json类型 2015-01-29 ? 注意:Ajax默认是不能跨域的,在最新的2.0里是可以跨域,但是需要对方应答. ? Ajax返回值之XML类型 <HTML代码> <html> ????<head> ????????<title>Ajax返回return</title> ????<script> function?createXHR(){ ????var?xhr?=?null; ????if(window

Android开发学习之路--网络编程之xml、json

一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了,参考http://cnbin.github.io/blog/2015/06/05/mac-an-zhuang-he-shi-yong-xampp/.安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了: 这个就

UI_16 XML、JSON数据结构解析

从事先规定好的格式中提取数据,即为解析.iOS开发常见的解析有:XML解析.JSON解析 一.XML解析 XML:Extensible Markup language(可扩展标记语?),主流数 据格式之?,可以?来存储和传输数据. XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.TinyXML和GDataXML.如何选择? 以下几点摘自iOS平台XML解析类库对比和安装说明

xStream完美转换XML、JSON

xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换: 它们都完美支持JSON,但是对xml的支持还不是很好.一定程度上限制了对Java对象的描述,不能让xml完全体现到对Java对象的描述.这里将会介绍xStream对JSON.XML的完美支持.xStream不仅对XML的转换非常友好,而且提供annotation注解,可以在JavaBean中完成对xml节点.属性的描述.以及对JSON也支持,只需要提供