【C++】rapidjson库—all is object

首先,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类型,所以说all is object(类似于Linux中的all is file)

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值