3.C++实现高性能json解析库

一、前言

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个数据类型,分别为:

  1. number(数字)
  2. boolean(布尔)
  3. string(字符串)
  4. list(列表)
  5. object(对象)

那么在C++中,这五种数据类型则可以分别对应以下五种数据类型:

  1. double
  2. bool
  3. string
  4. vector
  5. map

其中stringvectormap这三个严格来说应该不算数据类型,而是C++中的容器。

对于C++中的map而言,其键可以为任意类型,但对于json中的对象,其键只能为字符串,所以我们后面还需要将其限制一下。

但如果直接暴露以上这5个数据类型给别人使用,那未免太繁琐了,所以我们需要将这5个数据类型进行封装,让其统一成为一个数据类型:TJson

Tiny json的简写,当然你可以自行将其换成其它自己想用的名字,这无所谓。

重点是我们如何才能将5个数据类型统一为一个数据类型?

三、统一数据类型:TJson

统一数据类型,实际上就是对上面五种数据类型进行封装,然后在内部用一个变量来判断当前是什么数据类型:

#include<iostream>
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux