rapidjson代码封装类

  以下代码封装了rapidjson增删改查等基本操作:

 /************************************************************************/
/* CRJSONWrapper,简单封装rapidjson的一些操作 [6/22/2017 by whg] */
/* 部分代码待调试 [6/23/2017 by whg] */
/************************************************************************/
#pragma once
#ifndef WHG_RJSON_WRAPPER
#define WHG_RJSON_WRAPPER
#include <iostream>
#include <windows.h>
#include <string>
#include <fstream>
#include "document.h"
#include "writer.h"
#include "stringbuffer.h"
#include "filereadstream.h"
#include "filewritestream.h" using namespace rapidjson;
using namespace std;
#define RJSON #ifndef RJSON_NEW_RETURN
#define RJSON_NEW_RETURN(pt,classname,ret_val) \
do{ pt = new classname;\
if(pt == ) {return ret_val;}\
} while ();
#endif typedef Value::ConstMemberIterator RJSON_ValueMemberIter;
typedef Value::ConstValueIterator RJSON_ValueArrayIter; class CRJSONWrapper
{
public:
/* ReadJsonFromFile,本地目录读取json文件,返回读取状态
* ret: 操作状态
* in: 输入本地路径
* out: 输出rapidjson的doc
*/
static bool ReadDocFromFile(__in const char* filepath,__out rapidjson::Document& doc)
{
std::ifstream infile(filepath);
if (infile)
{
std::string str,temp;
while (getline(infile,temp))
str += temp;
infile.close();
rapidjson::StringStream buf(str.c_str());
doc.ParseStream(buf);
return true;
}
return false;
}
#define RJSON_READ_DOC_FROM_FILE(filepath,doc) CRJSONWrapper::ReadDocFromFile(filepath,doc) /* ReadJsonFromString,string读取json文件,返回读取状态
* ret: 操作状态
* in: 输入本地路径
* out: 输出rapidjson的doc
*/
static bool ReadDocFromString(__in const std::string& strIn,__out rapidjson::Document& doc)
{
if (strIn.empty())
return false;
doc.Parse(strIn.c_str());
return true;
}
#define RJSON_READ_DOC_FROM_STRING(strIn,doc) CRJSONWrapper::ReadDocFromString(strIn,doc) /* WriteDocToString,doc转成string,返回操作状态
* ret: 操作状态
* in: 输入本地路径
* out: 输出rapidjson的doc
*/
static bool WriteDocToFile(__in const rapidjson::Document& doc,__in const std::string& strFilePath)
{
StringBuffer buffer;
rapidjson::Writer<StringBuffer> writer(buffer);
doc.Accept(writer);
std::string strJson(buffer.GetString(), buffer.GetSize());
std::ofstream outfile;
outfile.open(strFilePath.c_str());
if (outfile.fail())
return false;
outfile << strJson;
outfile.close();
return true;
}
#define RJSON_WRITE_VALUE_TO_FILE(value,strFilePath) CRJSONWrapper::WriteDocToFile((Document&)value,strFilePath) /* WriteDocToString,doc转成string,返回操作状态
* ret: 操作状态
* in: 输入本地路径
* out: 输出rapidjson的doc
*/
static bool WriteDocToString(__in const rapidjson::Document& doc,__out std::string& strOut)
{
StringBuffer buffer;
rapidjson::Writer<StringBuffer> writer(buffer);
doc.Accept(writer);
strOut = buffer.GetString();
return true;
}
#define RJSON_WRITE_DOC_TO_STRING(value,strOut) CRJSONWrapper::WriteDocToString((Document&)value,strOut) // 定义document [6/23/2017 by whg]
#define RJSON_DOC(doc) rapidjson::Document doc; // 定义Value,type如kArrayType等[6/23/2017 by whg]
#define RJSON_VALUE(value,valuetype) Value value(valuetype); // 从Document获取allocator[6/23/2017 by whg]
#define RJSON_DOC_GET_ALLOC(doc,ALLOC) Document::AllocatorType& ALLOC = doc.GetAllocator(); // 从VALUE中获取member的value [7/13/2017 by whg]
#define RJSON_VALUE_GET_MEMBER_STRING(value,memName,memValue) \
if (value.IsObject())\
{\
if (value.HasMember(memName) && value[memName].IsInt())\
{\
int id = value[memName].GetInt();\
char ch[]={};\
sprintf_s(ch,"%d",id);\
memValue = std::string(ch);\
}\
else if (value.HasMember(memName) && value[memName].IsString())\
{\
memValue = value[memName].GetString();\
}\
} // 从value中获取object对象[8/10/2017 by whg]
#define RJSON_VALUE_GET_OBJECT_MEMBER(father,memName,child) \
if (father.IsObject())\
{\
if (father.HasMember(memName) && father[memName].IsObject())\
{\
child = father[memName];\
}\
} // 从value中获取array对象[8/10/2017 by whg]
#define RJSON_VALUE_GET_ARRAY_MEMBER(father,memName,child) \
if (father.IsObject())\
{\
if (father.HasMember(memName) && father[memName].IsArray())\
{\
child = father[memName];\
}\
} /* rapidjson-增操作*/
// 为Document增加成员 [6/23/2017 by whg]
#define RJSON_DOC_ADD_STRING_MEMBER(doc,strKEY,strVALUE) doc.AddMember(Value(strKEY, doc.GetAllocator()).Move(), Value(strVALUE, doc.GetAllocator()).Move(), doc.GetAllocator()); // 为value增加成员 [6/23/2017 by whg]
#define RJSON_VALUE_ADD_STRING_MEMBER(value,strKEY,strVALUE,ALLOC) value.AddMember(Value(strKEY, ALLOC).Move(), Value(strVALUE, ALLOC).Move(), ALLOC); // 为Document增加Value [6/23/2017 by whg]
#define RJSON_DOC_ADD_VALUE(doc,strKEY,value) doc.AddMember(strKEY, value, doc.GetAllocator()); // 为Value增加成员 [6/23/2017 by whg]
#define RJSON_VALUE_ADD_STRING_MEMBER(value,strKEY,strVALUE,ALLOC) value.AddMember(Value(strKEY, ALLOC).Move(), Value(strVALUE, ALLOC).Move(), ALLOC); // 为Document增加Value [6/23/2017 by whg]
#define RJSON_VALUE_ADD_VALUE(father,strKEY,child,ALLOC) father.AddMember(strKEY, child, ALLOC); // 为类型为Array的Value增加成员 [6/23/2017 by whg]
#define RJSON_ARRAY_ADD_VALUE(array,value,ALLOC) if(array.IsArray()){array.PushBack(value, ALLOC);} // value的member迭代操作[6/23/2017 by whg]
#define RJSON_ITER_MEMBER_BEGIN(value,mem_iter) for(RJSON_ValueMemberIter mem_iter=value.MemberBegin();mem_iter!=value.MemberEnd();mem_iter++)\
{
#define RJSON_ITER_MEMBER_END \
} // 获取迭代器mem_iter的name,所有name都是string [6/23/2017 by whg]
#define RJSON_ITER_MEMBER_GETNAME(mem_iter,strName) {strName = mem_iter->name.GetString();} // 获取迭代器mem_iter的value,所有name都是string [6/23/2017 by whg]
#define RJSON_ITER_MEMBER_GETSTRVALUE(mem_iter,strValue) if(mem_iter->value.IsString()){\
strValue = mem_iter->value.GetString();} // 数组value的iterator迭代操作[6/23/2017 by whg]
#define RJSON_ITER_ARRAY_BEGIN(value,array_iter) for (RJSON_ValueArrayIter array_iter=value.Begin();array_iter!=value.End();array_iter++)\
{
#define RJSON_ITER_ARRAY_End\
} // 根据数组项的name取出数组为string类型的值 [6/23/2017 by whg]
#define RJSON_VALUE_GET_STRVALUE(value,strName,strValue) if (value.HasMember(strName) && value[strName].IsString()){\
strValue = value[strName].GetString();} // object删除member成员[6/23/2017 by whg]
#define RJSON_REMOVE_MEMBER(value,strMemName) if (value.IsObject() && value.HasMember(std::string(strMemName).c_str())){\
value.RemoveMember(std::string(strMemName).c_str());} /* DeleteArrayItem,元素为object的array,删除含有指定name和value的对应object,返回操作状态
* ret: 操作状态
* in: 元素为object的array,member的name和value(string类型),删除所有查找到的object还是删除第一次
*/
// 未能实现删除所有相关元素,待测试[6/23/2017 by whg]
static bool DeleteArrayItem(__in const rapidjson::Value& value,__in std::string strKey,__in std::string strValue,__in bool bOnlyFirst = true)
{
if (!value.IsArray())
return false;
//查找操作
RJSON_ITER_ARRAY_BEGIN(value,iterObject)
{
RJSON_ITER_MEMBER_BEGIN((*iterObject),iterMem)
{
string strname,strvalue;
RJSON_ITER_MEMBER_GETNAME(iterMem,strname);
RJSON_ITER_MEMBER_GETSTRVALUE(iterMem,strvalue);
//RJSON_DOC_REMOVE_MEMBER((*iter2),strname);
if (strname.compare(strKey) == && strvalue.compare(strValue) == )
{
Value& v = const_cast<Value&>(value);
if (iterObject != v.End()+)
{
iterObject = v.Erase(iterObject);
}
else
v.Erase(iterObject); if (bOnlyFirst)
return true;
break;
}
}
RJSON_ITER_MEMBER_END
}
RJSON_ITER_ARRAY_End
return true;
}
#define RJSON_ARRAY_REMOVE_OBJECT(value,strKey,strValue) CRJSONWrapper::DeleteArrayItem(value,strKey,strValue)
};
#endif

  增删改查操作:

  增操作的一个例子:

   std::string res;
RJSON_DOC(doc);
RJSON_DOC_GET_ALLOC(doc,alloc);
doc.SetObject();
RJSON_DOC_ADD_MEMBER(doc,"type","config");
// 添加data节点 [8/8/2017 by whg]
RJSON_VALUE(data,kObjectType);
// data下添加music节点 [8/8/2017 by whg]
RJSON_VALUE(music,kObjectType);
RJSON_VALUE_ADD_MEMBER(music,"vo","",alloc);
RJSON_VALUE_ADD_MEMBER(music,"si","",alloc);
RJSON_VALUE_ADD_VALUE(data,"mu",music,alloc);
// data下添加percent节点 [8/8/2017 by whg]
RJSON_VALUE(percent,kObjectType);
RJSON_VALUE_ADD_MEMBER(percent,"volume","",alloc);
RJSON_VALUE_ADD_VALUE(data,"percent",percent,alloc);
// data下添加audio节点 [8/8/2017 by whg]
RJSON_VALUE(audio,kObjectType);
RJSON_VALUE_ADD_MEMBER(audio,"volume","",alloc);
RJSON_VALUE_ADD_VALUE(data,"audio",audio,alloc);
// doc下添加sp_data节点 [8/8/2017 by whg]
RJSON_DOC_ADD_VALUE(doc,"sp_data",data);
RJSON_WRITE_DOC_TO_STRING(doc,res);

rapidjson代码封装类的更多相关文章

  1. RapidJSON 代码剖析(四):优化 Grisu

    我曾经在知乎的一个答案里谈及到 V8 引擎里实现了 Grisu 算法,我先引用该文的内容简单介绍 Grisu.然后,再谈及 RapidJSON 对它做了的几个底层优化. (配图中的<Grisù& ...

  2. RapidJSON 代码剖析(三):Unicode 的编码与解码

    根据 RFC-7159: 8.1 Character Encoding JSON text SHALL be encoded in UTF-8, UTF-16, or UTF-32. The defa ...

  3. RapidJSON 代码剖析(二):使用 SSE4.2 优化字符串扫描

    现在的 CPU 都提供了单指令流多数据流(single instruction multiple data, SIMD)指令集.最常见的是用于大量的浮点数计算,但其实也可以用在文字处理方面. 其中,S ...

  4. RapidJSON 代码剖析(一):混合任意类型的堆栈

    大家好,这个专栏会分析 RapidJSON (中文使用手册)中一些有趣的 C++ 代码,希望对读者有所裨益. C++ 语法解说 我们先来看一行代码(document.h): bool StartArr ...

  5. WIN 下的超动态菜单(三)代码

    WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ 超动态 ...

  6. rapidjson使用总结

    Reference:  https://blog.csdn.net/elloop/article/details/49908689 rapidjson简介 rapidjson是腾讯的开源json解析框 ...

  7. 结巴分词和自然语言处理HanLP处理手记

    手记实用系列文章: 1 结巴分词和自然语言处理HanLP处理手记 2 Python中文语料批量预处理手记 3 自然语言处理手记 4 Python中调用自然语言处理工具HanLP手记 5 Python中 ...

  8. 个人写spark小测试

    写脚本生成类似文件 java 代码 封装类 package day0327; import java.util.UUID; public class data { private String ip; ...

  9. iOS蓝牙原生封装,助力智能硬件开发

    代码地址如下:http://www.demodashi.com/demo/12010.html 人工智能自1956年提出以来,一直默默无闻,近年来人工智能的发展得到重视逐渐发展起步,智能硬件.智能手环 ...

随机推荐

  1. pycharm中格式标准化代码

    点击之后,可以使代码标准化

  2. JavaScript数据结构与算法-散列练习

    散列的实现 // 散列类 - 线性探测法 function HashTable () { this.table = new Array(137); this.values = []; this.sim ...

  3. diff工具

    Beyond Compare 4  可以diff文件夹.单个文件.

  4. 让phpstorm 支持 vue文件并且语法高亮

    1 安装 vue.js 插件 很遗憾,我的win版本没有支持的插件 2 修改文件类型 vue本质上还是html文件,包含了css html js,用html类型文件打开就可以 给html 文件添加 * ...

  5. 关于python代码是编译执行还是解释执行

    Python 是编译型语言还是解释型语言?回答这个问题前,应该先弄清楚什么是编译型语言,什么是解释型语言. 所谓编译执行就是源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下 ...

  6. 数据库之MySQL(一)

    概述 1.什么是数据库 ?   数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ...

  7. PAT 1073 多选题常见计分法 (20 分)

    批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生选择了任何一个错误的选项,则不能得分.本 ...

  8. Js用户引导插件bootstrap-tour

    1.demo直接贴上来了,有什么不懂的,直接去官网上看,地址:http://bootstraptour.com/. 2.这个bootstrap-tour插件的版本是v0.12.0,复制下来代码,引入库 ...

  9. (4.8)SQL Server DAC——专用管理员连接

    SQL Server DAC——专用管理员连接 默认情况下,只有本地可以使用DAC连接,但也可以开启远程DAC sp_configure ; go reconfigure with override; ...

  10. MongoDB学习笔记—常用命令

    这里记录一下MongoDB常用的命令 数据库相关 创建数据库 use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 删除数据库:切换到要删除的数据库下,执行命令即 ...