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. E - I Hate It(基础线段树)

    E - I Hate It Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descr ...

  2. JS复制粘贴解决方案

    var clipboardData = window.clipboardData; //for IE if (!clipboardData) { // for chrome window.prompt ...

  3. python清除字符串中间空格的方法

    1.使用字符串函数replace >>> a = 'hello world' >>> a.replace(' ', '') 'helloworld' 看上这种方法真 ...

  4. 详解Amazon S3上传/下载数据

    AWS简单储存服务(Amazon S3)是非常坚牢的存储服务,拥有99.999999999%的耐久性(记住11个9的耐久性). 使用CloudBerry Explorer,从Amazon S3下载数据 ...

  5. PSSH 批量管理服务器

    pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...

  6. coursera 《现代操作系统》

    什么是独占设备技术?为什么说 “SPOOLing不是独占设备的”? 百度百科没有解释,从教材中找到了:  第二章 取数指令 load To load a value from memory, you ...

  7. 段合并 segments merge 被删除的文档的删除时间

    2.5 段合并 每个索引分为多个“写一次,读多次”的段 write once and read many times  segments 建立索引时,一个段写入磁盘以后就不能更新:被删除的文档的信息存 ...

  8. 博文分类索引--Python

    Python 基础 [python]-- 初识python [python]-- 基本语法.循环 [python]-- 列表 [python]-- 元组.字典 [python]-- 字符串.字符编码与 ...

  9. 【25】session练习

    #用登录练习session html1为首页,html2为登录页面 def session1(request): uname=request.session.get('myname','请登录') # ...

  10. Hexo+yilia博客添加背景音乐

    个人主页:https://www.yuehan.online 现在博客:www.wangyurui.top 第一步: 打开网易云音乐的官网:https://music.163.com/ 第二步: 搜索 ...