一、前言
json是一个非常常见的格式,目前广泛应用于web数据传输、软件配置文件等等。
但可惜C++标准库中并不存在解析json数据的库,所以想要在C++中解析json
格式的数据,目前最好的办法便是使用第三方库,比如很火的nlohmann
,就是一个非常优秀且好用的json
格式解析库。
相比之下,Qt中的那个解析库是真的难用。
正好最近有空,我也写了一个json
数据的生成与解析器,该解析器的目标:
- 精简:只有一个头文件与一个源文件,目前只有
400
行左右的代码量。 - 高效:一个
2M
大小的json
文件(格式化后为8M
),nlohmann
处理需要2s
左右,而我这库只需要0.5
秒左右。 - 简单:使用起来与
python
代码相似。
比如我要解析下面这段数据:
string str = R"(
{
"name":"test",
"number":10.987,
"array":[
1.0,
3.45,
9.80
],
"object":{
"name":"yushi",
"age":100
"sex":"man"
}
}
)";
使用我这个库的代码为:
TJson t; //声明一个对象
t.Parse(str); //解析
就是这么简单
想要访问或修改,那么可以这样写:
t["object"]["age"] = 50; //修改
cout << t["object"]; //访问
输出:
{"age": 50,"name": "yushi","sex": "man"}
看上去是不是相当的简单!
虽然看起来不错,不过目前还是有缺点的,那就是暂不支持UTF-8
编码,不过如果文件数据中只有英文字母、数字、标点符号,那便无所谓文件编码了,都可以用。
亲手写一个json
数据格式的解析器应该是一个不错的学习体验,所以我这里将其作为一个教程文章写出来。
二、了解json格式
json只有5个数据类型,分别为:
number
(数字)boolean
(布尔)string
(字符串)list
(列表)object
(对象)
那么在C++中,这五种数据类型则可以分别对应以下五种数据类型:
double
bool
string
vector
map
其中string
、vector
、map
这三个严格来说应该不算数据类型,而是C++中的容器。
对于C++中的map
而言,其键可以为任意类型,但对于json
中的对象,其键只能为字符串,所以我们后面还需要将其限制一下。
但如果直接暴露以上这5个数据类型给别人使用,那未免太繁琐了,所以我们需要将这5个数据类型进行封装,让其统一成为一个数据类型:TJson
即Tiny json
的简写,当然你可以自行将其换成其它自己想用的名字,这无所谓。
重点是我们如何才能将5个数据类型统一为一个数据类型?
三、统一数据类型:TJson
统一数据类型,实际上就是对上面五种数据类型进行封装,然后在内部用一个变量来判断当前是什么数据类型:
#include<iostream>