json数据解析与xml数据解析
Posted qq_34132502
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json数据解析与xml数据解析相关的知识,希望对你有一定的参考价值。
json数据解析与xml数据解析
一、Json能做什么
1、为什么要用JSON?
1.其实用JSON主要是因为它轻量,各个平台语言都支持JSON交互、JSON解析和存储。
2.JSON常用于我们接口交互,前后端交互中,有解析速度快,方便的特点。
3.JSON常用于我们一些配置文件也是因为解析方便,JSON存储数据体积小等特征,而不像XML、PList(也是xml的一种)等格式,定义各种Dom节点(当然复杂的格式还是建议XML)。
2、用JSON的好处是什么?
1.JSON是大家公认的传输格式,所以学习成本低,程序员之间交流经常会问,您接口返回什么格式?答曰:“JSON”,其实就没啥问题了。
2.各个语言、各个框架(第三方组件)都支持JSON,所以使用上来讲,复用率更高,不用格式转来转去。
3.体积小、解析速度快也是JSON的优点。
二、Json怎么组织数据逻辑
json数据由多个键值对组成
JSON 值可以是:
- 数字(整数或浮点数)
- 符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
键:必须用双引号(" "
)括起来
值:可以是通常的数据类型,如:字符串、数值、布尔值、数组、空值等;同时也可以是对象
其中对象用大括号({ }
)括起来,数组由中括号([ ]
)括起来。
每个键值对间用逗号(,
)隔开
在网页——www.json.cn可以检查就送数据书写是否出错
三、常见的Json开源项目(cjson jsoncpp rapidjson)
1、cjson
数据组织成树状,即:
struct cJSON
为root
根节点,第一个键值对为其子节点。而所有的键值对再组织成双链表,第一个键值对为首节点。
如果一个键值对的值为数值、字符串、布尔、空值一般的数据类型则无子节点,而值为对象、数组节点有子节点,其成员也双链表链接而成,以此类推。
重点函数
cJSON_Print
作用:将 cJSON 树形数据解析成 JSON 字符串,并在堆中开辟一块 char*的内存空间存储 JSON 字符串。cJSON_PrintUnformatted()与 cJSON_Print()类似,只是打印输出不带格式,而只是一个字符串数据。
注意:通过 cJSON_Print()可以将 cJSON 链表中所有的 cJSON 对象打印出来,但是需要手动去释放对应的资源:free(char *)。
对于没有子节点的数据结构,print到它就直接执行完成了,而执行到对象、数组这种有子节点的数据结构时,会不断地递归进行深度遍历,如下:
cJSON_Parse
作用:将一个 JSON 字符串,按照 cJSON 结构体的结构序列化整个数据包,并在堆中开辟一块内存存储树状 cJSON 结构体。
返回值:成功返回一个指向内存块中的 cJSON 的指针,失败返回 NULL。
2、jsoncpp
添加、取出json数据很简单,但是速度慢
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
#include <jsoncpp/json/value.h>
#include <jsoncpp/json/writer.h>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
Json::Value root;
Json::FastWriter fast;
root["ModuleType"] = Json::Value(1);
root["MOduleCode"] = Json::Value("China");
cout<<fast.write(root)<<endl;
Json::Value sub;+
sub["version"] = Json::Value("1.0");
sub["city"] = Json::Value(root);
fast.write(sub);
cout<<sub.toStyledString()<<endl;
return 0;
}
注意
root["name"] = Json::nullValue;
root["name"] = NULL; // 错误
3、rapidjson
速度快
四、xml
在本地配置文件时用的较多,比json可读性更高。但是网络传输用的较少。
数据组织方式与json相同,都是由树构成
元素
XML 文档中的第一个元素被称为根元素,在任何一个 XML 文档中有且只有一个元素被称为根元素。其余所有的元素都是子元素,子元素必须正确的嵌套在根元素中。
xml支持注释,它把注释也当做一个节点
属性
属性是用来修饰某个元素的,如:
关于元素的属性需注意如下几个问题:
- 属性的值必须用引号括起来,如: attribute1=“aa” 或 attribute3=‘aa’ ;
- 元素的属性以名和值成对出现;
- 用来修饰同一个元素的属性的属性名不能相同 ;
- 属性值不能包含“&”、“’”、“<”等字符。
属性也有相应的增删改查的接口
总结
可读性:xml > json > protobuf
序列化速度: xml < json < protobif
序列化大小: protobuf < json < xml
http api接口配置:json
本地配置:xml
rpc:protobuf
两个服务器直接通信,也是rpc
如果双方协议没有最终确定,可以先用json,因为添加删除字段简单,protobuf添加删除麻烦些
以上是关于json数据解析与xml数据解析的主要内容,如果未能解决你的问题,请参考以下文章