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. oracle中如何判断某个日期是星期几

    SELECT to_char(to_date('2011-03-13','YYYY-MM-DD'),'d') FROM DUAL 其中 红色部分为传入日期 to_char的其他用法 Select to ...

  2. Xtrabackup 使用方法

    简介:Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品.本文测试使用的是1.3版本,X ...

  3. Xamarin.Forms学习之位图(二)

    上篇文章分享了如何加载网络图片和PCL中的图片,所以今天继续分享关于如何加载平台的内嵌图片,在这之前说一下上篇文章开头的一个问题:为什么不能加载UWP项目,这是因为我升级了UWP的SDK,而Xamar ...

  4. jQuery DOM 元素方法(get)

    jQuery DOM 元素方法 1..get() 获得由选择器指定的 DOM 元素. $(selector).get(index)index 可选.规定获取哪个匹配元素(通过 index 编号). 实 ...

  5. 巨蟒python全栈开发linux之centos5

    1.nginx安装使用 2.nginx访问日志和压测命令 3.nginx反向代理配置 nginx的404页面 访问:淘宝官网的一个错误地址:http://taobao.com/eeeeeeee 淘宝的 ...

  6. Jsp页面截取字符串

    用jstl标签: 首先页面中引入<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions ...

  7. Android系统移植与调试之------->如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关

    今天有个用户对[设置]有个特殊的要求,即: 1.开机的时候默认显示[开发者选项]并打开[USB调试]开关    ([Developer options]-->[USB debugging]) 2 ...

  8. Apache JServ Protocol (AJP)

    The Apache JServ Protocol (AJP) is a binary protocol that can proxy inbound requests from a web serv ...

  9. SQLServer: 用 ApexSQLLog 恢复 SQL Server 数据

    https://blog.csdn.net/yenange/article/details/50512312

  10. Personal Ubuntu

    @1:修改了打开主文件夹的快捷键 CTRL + ALT + R @2:增加了强制关闭程序的快捷键CTRL + ALT+ X,程序为~/lxw0109/ownAdmin/closeProgram.sh( ...