json数据解析与xml数据解析

Posted qq_34132502

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 cJSONroot根节点,第一个键值对为其子节点。而所有的键值对再组织成双链表,第一个键值对为首节点。
如果一个键值对的值为数值、字符串、布尔、空值一般的数据类型则无子节点,而值为对象、数组节点有子节点,其成员也双链表链接而成,以此类推。

在这里插入图片描述

重点函数

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数据解析的主要内容,如果未能解决你的问题,请参考以下文章

XML解析与JSON解析

2 Go语言JSON与XML解析与表单操作

2 Go语言JSON与XML解析与表单操作

在 iOS 中解析 JSON 与解析 XML

2 Go语言JSON与XML解析与表单操作

2 Go语言JSON与XML解析与表单操作