rapidjson 数组格式的怎么用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rapidjson 数组格式的怎么用相关的知识,希望对你有一定的参考价值。
参考技术A 上一个我用的 C/C++ std::string json_to_string( const rapidjson::Value& object ) rapidjson::StringBuffer buf; rapidjson::Writer w(buf); object.Accept(w); return std::string(buf.GetString());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 数组格式的怎么用的主要内容,如果未能解决你的问题,请参考以下文章