rapidjson使用笔记--rapidjson创建json对象的方法。创建arrary/object以及嵌套创建 kObjectType kArrayType
发布日期:2021-06-30 13:42:07 浏览次数:3 分类:技术文章

本文共 6552 字,大约阅读时间需要 21 分钟。

在工作中需要在函数里面创建一个json的dom 然后将这个数据返回到http客户端,这里分享以下怎么去创建一个dom,以及怎么去项dom中添加一般的成员和array[数组]以及object{对象}。

在我的前一篇博客中分享了如何使用rapidjson去分析一个json对象的参数,这一篇主要介绍如何去创建一个json。
代码的下载地址在这里:https://gitee.com/jeasonb/rapidjson_test 这是整个的工程
创建一个json 的第一步是声明一个dom。
然后给dom一个初始要解析的string

rapidjson::Document document;    document.Parse("{\"key\":1,\"key2\":[1,2,3,4]}");    //document.Parse("{}");  这两种方法都可以 如果有已知的可以上面的方法加入成员

接下来要声明一个allocator ,具体的原理我不是很明白,猜测就是一个关于这个json的指针,指示接下来的dom 去申请内存用的 ,总之在一个json文件里添加任何的变量都需要用到这个allocator!!!

可能是用于索引吧。

rapidjson::Document::AllocatorType& allocator = document.GetAllocator();

添加一般的成员变量比较简单,这里要注意关于string 的引入 。我在实际开发的时候遇到了不加修饰的

char[] 报错问题
‘rapidjson::GenericStringRef::GenericStringRef(CharType (&)[N]) [with unsigned int N = 20; CharType = char]’ is private within this context

char str[20] = {
's','t','r','i','n','g',}; document.AddMember("string","this is string!",allocator); document.AddMember("string2",rapidjson::StringRef(str),allocator);//可以用宏定义修饰 解决一些报错 document.AddMember("int",123,allocator); document.AddMember("double",123.45678,allocator); document.AddMember("bool",true,allocator);

接下来就是本次分享的重头戏,嵌套的arry和object.

json的结构在我看来是一种可以无限嵌套的结构,在Array 中的成员可以是object,而object 有能包含很多的object以及arrary。
先做一个array, 在写arrary 之前我们需要先去声明一个arrary的 Value
然后将数据像压堆栈一样依次的push进去。先测试以下简单的类型的arrary

rapidjson::Value a(rapidjson::Type::kArrayType);    for(int i=0;i<5;i++)    {
a.PushBack(i*2,allocator); } document.AddMember("Int_arrary",a,allocator);

不是很清楚具体的实现机制,但是看起来就像是压入堆栈一样。

截至目前我们实现的dom的输出是这样的

{
"key": 1, "key2": [ 1, 2, 3, 4 ], "string": "this is string!", "string2": "string", "int": 123, "double": 123.45678, "bool": true, "Int_arrary": [ 0, 2, 4, 6, 8 ], ........

接下来我们将object加入到我们的dom 中。

rapidjson::Value b(rapidjson::Type::kObjectType);        b.AddMember("city"    ,"shenzhen",allocator);    b.AddMember("author"  ,"jeason",allocator);    b.AddMember("email","1666532400@qq.com",allocator);    b.AddMember("age"  ,11111,allocator);        // object 内部嵌套arrary     rapidjson::Value c(rapidjson::Type::kArrayType);    for(int i=0;i<5;i++)    {
c.PushBack(i*3,allocator); } b.AddMember("arrary_in_object",c,allocator); document.AddMember("obj",b,allocator);

上面的代码实现了向一个object 内部添加成员,并且其中的一个成员是一个arrary

输出的内容:

"obj": {
"city": "shenzhen", "author": "jeason", "email": "1666532400@qq.com", "age": 11111, "arrary_in_object": [ 0, 3, 6, 9, 12 ] },

接下来我们创建一个 全部是object的arrary

rapidjson::Value array_obj(rapidjson::Type::kArrayType);    for(int i=0;i<3;i++)    {
rapidjson::Value temp(rapidjson::Type::kObjectType); temp.AddMember("test",i,allocator); temp.AddMember("test*2",i*2,allocator); array_obj.PushBack(temp,allocator); } document.AddMember("array_obj",array_obj,allocator);

输出的结果

"array_obj": [        {
"test": 0, "test*2": 0 }, {
"test": 1, "test*2": 2 }, {
"test": 2, "test*2": 4 } ]

从上面的结构可以推断出,arrary和object 是可以无限套娃的,更深层次的套娃我就不去介绍了,读者们自行研究吧。

代码的下载地址在这里:https://gitee.com/jeasonb/rapidjson_test 这是整个的工程
开发环境是windows10 vscode + cmake + mingw32
具体的参数配置读者自行研究或者给我留言吧!

#include 
#include
#include "./rapidjson/include/document.h"#include "./rapidjson/include/stringbuffer.h"#include "./rapidjson/include/istreamwrapper.h"#include "./rapidjson/include/prettywriter.h"#include "./rapidjson/include/filereadstream.h"#include "./rapidjson/include/filewritestream.h"#include "./rapidjson/include/pointer.h"#include "./rapidjson/include/writer.h"#include
using namespace std;void test(void);int main(void){
test(); system("pause"); return 0;}void test(void){
rapidjson::Document document; document.Parse("{\"key\":1,\"key2\":[1,2,3,4]}"); //document.Parse("{}"); 这两种方法都可以 如果有已知的可以上面的方法加入成员 rapidjson::Document::AllocatorType& allocator = document.GetAllocator(); char str[20] = {
's','t','r','i','n','g',}; document.AddMember("string","this is string!",allocator); document.AddMember("string2",rapidjson::StringRef(str),allocator);//可以用宏定义修饰 解决一些报错 document.AddMember("int",123,allocator); document.AddMember("double",123.45678,allocator); document.AddMember("bool",true,allocator); //if(document.HasMember("key")) rapidjson::Value a(rapidjson::Type::kArrayType); for(int i=0;i<5;i++) {
a.PushBack(i*2,allocator); } document.AddMember("Int_arrary",a,allocator); rapidjson::Value b(rapidjson::Type::kObjectType); b.AddMember("city" ,"shenzhen",allocator); b.AddMember("author" ,"jeason",allocator); b.AddMember("email","1666532400@qq.com",allocator); b.AddMember("age" ,11111,allocator); // object 内部嵌套arrary rapidjson::Value c(rapidjson::Type::kArrayType); for(int i=0;i<5;i++) {
c.PushBack(i*3,allocator); } b.AddMember("arrary_in_object",c,allocator); document.AddMember("obj",b,allocator); rapidjson::Value array_obj(rapidjson::Type::kArrayType); for(int i=0;i<3;i++) {
rapidjson::Value temp(rapidjson::Type::kObjectType); temp.AddMember("test",i,allocator); temp.AddMember("test*2",i*2,allocator); array_obj.PushBack(temp,allocator); } document.AddMember("array_obj",array_obj,allocator); rapidjson::StringBuffer buffer ; rapidjson::PrettyWriter
writer(buffer); document.Accept(writer); printf("buffer : %s",buffer.GetString()); std::string temp(buffer.GetString());}

完整的输出:

buffer : {
"key": 1, "key2": [ 1, 2, 3, 4 ], "string": "this is string!", "string2": "string", "int": 123, "double": 123.45678, "bool": true, "Int_arrary": [ 0, 2, 4, 6, 8 ], "obj": {
"city": "shenzhen", "author": "jeason", "email": "1666532400@qq.com", "age": 11111, "arrary_in_object": [ 0, 3, 6, 9, 12 ] }, "array_obj": [ {
"test": 0, "test*2": 0 }, {
"test": 1, "test*2": 2 }, {
"test": 2, "test*2": 4 } ]}请按任意键继续. . .

转载地址:https://jeason.blog.csdn.net/article/details/108327885 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:VScode 折叠函数快捷键 合上函数
下一篇:rapidjson笔记--rapidjson读取/修改/保存以及输出pretty的结构 windows 下使用cmake做json 解析 rapidjson

发表评论

最新留言

很好
[***.229.124.182]2024年04月14日 22时41分11秒