rapidjson库

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rapidjson库相关的知识,希望对你有一定的参考价值。

首先,json(javascript objection notation)是一种轻量级的数据交换格式,正是由于其轻量的这个特点,经常替代程序中的变量、对象,被用作程序之间数据传输的格式。

rapidjson?是不是听起来很耳熟,想到了java中使用的fastjson这个依赖,fastjson用来进行java对象和json数据格式之间的转换,一个rapid一个fast哈哈哈,知道你们都是轻量级的了。

rapidjson一个应用在C++程序中json的生成器和解析器

相较于jsoncpp库,rapidjson只有头文件,容易安装

#include "rapidjson/document.h"	//引入rapidjson源文件

rapidjson不依赖STL和boost等外部库独立,只使用如下文件:<cstdio>, <cstdlib>, <cstring>, <inttypes.h>, <new>, <stdint.h>

下面将介绍rapidjson库的使用。

1.引入rapidjson库

需要两行

#include "rapidjson/document.h"	//引入rapidjson源文件
using namespace rapidjson;		//使用rapidjson命名空间,如果没有这个语句,将无法使用Document等数据类型,
								//除非你想以rapidjson::Document document;这样的方式命名变量

2. 基本单元

rapidjson的基本操作单元是Document和value

例:当有一个json案例,请让我们称之为test.json。从头到尾这一长串,我们称之为json字符串


	"test_int": 100,
	"test_float": 100.9,
	"test_string": "asd",
	"test_float_array": [],
	"test_object": 
		"vec_key": [9, 3, 5, 7, 2, 0],
		"i_key": 789,
		"f_key": 111.3,
		"s_key": "qwe"
	

在rapidjson中的Document就相当于test.json文件本身左边是key,右边是value

3. 构建

(1)构建document

如果我们手中有test.json所示的字符串数据,我们可以直接将这个数据装载进Document中:

#include "rapidjson/document.h"	//引入rapidjson源文件
using namespace rapidjson;		//使用rapidjson命名空间,如果没有这个语句,将无法使用Document等数据类型,
								//除非你想以rapidjson::Document document;这样的方式命名变量
// ...
Document document;				//创建Document变量document
document.Parse(json);			//将已有的json变量导入document

当然你也可以不用Parse方法去装填数据到document,在本篇文章后面会有直接把自己想要的数据装填进document的方法教程 。

(2)构建value

构建Value的方法比较多,最简单是利用作者写好的重载方法:

Value b(true);    // 调用 Value(bool)
Value i(-123);    // 调用 Value(int)
Value u(123u);    // 调用 Value(unsigned)
Value d(1.5);     // 调用 Value(double)

 也可以采用各种set方法,或者是直接赋值的方式进行设置:

Value v;   			 // Null
v.SetBool(true);	//调用set方法进行设置
v.SetInt(10);
v.SetFloat(12.3);
v.SetString("qwe");
v = true;			// 简写,和上面的相同
v = 10;
v = 12.3;
v = "qwe";

以上所示的方法,可以将value设置成各种类型的数据 。rapidjson定义的json数据类型有7种,如下所示: 

//! Type of JSON value
enum Type 
    kNullType = 0,      //!< null
    kFalseType = 1,     //!< false
    kTrueType = 2,      //!< true
    kObjectType = 3,    //!< object
    kArrayType = 4,     //!< array 
    kStringType = 5,    //!< string
    kNumberType = 6     //!< number
;

3. 增加

AddMember(key,value,allocator)

(1)给出一个简单的演示

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
using namespace rapidjson;
//...
	Document document; 		// Null
	document.SetObject();	//如果不使用这个方法,AddMember将会报错
	Value value;   			// Null
	value.SetBool(true);	//调用set方法进行设置
	//下面就是装填value到document的方法,对于所有数据类型都是一样的
	document.AddMember("bool_key",value,document.GetAllocator());
//...

其中注意的是,必须加下面这一行。同时可以看出,虽然rapidjson中有7种数据类型,但是都可以被看作object类型

document.SetObject();	//如果不使用这个方法,AddMember将会报错

document得到的json字符串为:


	"bool_key": true

 (2)添加object类型的数据

#include "rapidjson/document.h"
#include "rapidjson/writer.h"
using namespace rapidjson;
//...
Document document; 			// Null
document.SetObject();		//如果不使用这个方法,AddMember将会报错
//下面会遇到多次使用allocator的情况,采用这种方式避免多次调用GetAllocator()去获取allocator
Document::AllocatorType& allocator = document.GetAllocator();
Value value(kObjectType);   	// 创建一个array类型的value数据,如果没有kArrayType这个类型说明,后面是用PushBack方法操作value的时候会报错
 
value.AddMember("int_key",123,allocator);		//value添加int类型数据
value.AddMember("float_key",1.23,allocator);	//value添加float类型数据
value.AddMember("string_key","Lua",allocator);	//value添加string类型数据
//下面就是装填value到document的方法,对于所有数据类型都是一样的
document.AddMember("obj_key",value,allocator);
 
value.SetInt(123);
document.AddMember("i_key",value,allocator); //document添加int类型数据
value.SetFloat(1.23);
document.AddMember("f_key",value,allocator); //document添加float类型数据
value.SetString("Mio");
document.AddMember("s_key",value,allocator); //document添加string类型数据
//...

无论是向object中添加数据,还是向整个document中添加数据,使用的都是AddMember函数。 

构造出的json字符串为:


	"obj_key": 
		"int_key": 123,
		"float_key": 1.23,
		"string_key": "Lua"
	,
	"i_key": 123,
	"f_key": 1.23,
	"s_key": "Mio"

4. 删除

rapidjson中提供了两个删除接口,一个是:RemoveAllMembers(),这个函数用来删除document或value中的所有数据,在想要清空json,并添加新数据的时候可以用。

另一个接口是RemoveMember(key),这个函数的作用是删除掉document或value中键名 == key的数据,这个接口的使用很简单,我就不做演示了。


5. 输出json字符串

上面介绍的都是如何把json字符串转化为C++对象document的方法。接下来介绍如果给我们一个document对象,如何将它转换为json字符串并输出呢?

这里用的是rapidjson的write方法,将数据写入到StringBuffer中:

StringBuffer jsonBuffer;
Writer<StringBuffer> writer(jsonBuffer);
document.Accept(writer);
printf("%s\\n",jsonBuffer.GetString());

借鉴C++ rapidjson 基础入门_众秒之童的博客-CSDN博客_rapidjson

其实直接去看官网更好一些。

以上是关于rapidjson库的主要内容,如果未能解决你的问题,请参考以下文章

rapidjson安装使用

rapidjson安装使用

使用 rapidjson 和 ATL CString

RapidJSON解析数组

C++ rapidjson 基础入门

ejson4cpp——一个使用极致简单且性能可比rapidjson的C++json解析库