rapidjson代码封装类
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代码封装类的更多相关文章
- RapidJSON 代码剖析(四):优化 Grisu
我曾经在知乎的一个答案里谈及到 V8 引擎里实现了 Grisu 算法,我先引用该文的内容简单介绍 Grisu.然后,再谈及 RapidJSON 对它做了的几个底层优化. (配图中的<Grisù& ...
- RapidJSON 代码剖析(三):Unicode 的编码与解码
根据 RFC-7159: 8.1 Character Encoding JSON text SHALL be encoded in UTF-8, UTF-16, or UTF-32. The defa ...
- RapidJSON 代码剖析(二):使用 SSE4.2 优化字符串扫描
现在的 CPU 都提供了单指令流多数据流(single instruction multiple data, SIMD)指令集.最常见的是用于大量的浮点数计算,但其实也可以用在文字处理方面. 其中,S ...
- RapidJSON 代码剖析(一):混合任意类型的堆栈
大家好,这个专栏会分析 RapidJSON (中文使用手册)中一些有趣的 C++ 代码,希望对读者有所裨益. C++ 语法解说 我们先来看一行代码(document.h): bool StartArr ...
- WIN 下的超动态菜单(三)代码
WIN 下的超动态菜单(一)简介 WIN 下的超动态菜单(二)用法 WIN 下的超动态菜单(三)代码 作者:黄山松,发表于博客园:http://www.cnblogs.com/tomview/ 超动态 ...
- rapidjson使用总结
Reference: https://blog.csdn.net/elloop/article/details/49908689 rapidjson简介 rapidjson是腾讯的开源json解析框 ...
- 结巴分词和自然语言处理HanLP处理手记
手记实用系列文章: 1 结巴分词和自然语言处理HanLP处理手记 2 Python中文语料批量预处理手记 3 自然语言处理手记 4 Python中调用自然语言处理工具HanLP手记 5 Python中 ...
- 个人写spark小测试
写脚本生成类似文件 java 代码 封装类 package day0327; import java.util.UUID; public class data { private String ip; ...
- iOS蓝牙原生封装,助力智能硬件开发
代码地址如下:http://www.demodashi.com/demo/12010.html 人工智能自1956年提出以来,一直默默无闻,近年来人工智能的发展得到重视逐渐发展起步,智能硬件.智能手环 ...
随机推荐
- C语言练习题
C语言练习题 1. 以下选项中,合法的一组C语言数值常量是( ) A)028 .5e-3 .0xf B)12. OXa23 4.5e0 C).177 4e1.5 Oabc D) ...
- Adjacency List
w Python Patterns - Implementing Graphs | Python.orghttps://www.python.org/doc/essays/graphs/ Graph ...
- Git 命令行帮助
Git usage: git [--version] [--help] [-C <path>] [-c name=value] [--exec-path[=<path>]] [ ...
- Python3.6全栈开发实例[009]
9.字典dic,dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}a.请循 ...
- 常用算法及其Python实现
冒泡排序 def bubble_sort(li): for i in range(len(li)-1): # i表示第几趟 for j in range(len(li)-i-1 ...
- (4.6)sql server索引缺失提示
SQLSERVER如何查看索引缺失 sql server索引缺失提示 当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能, 但是面对一个复杂的SQL语句,找到一个优化的索引组合 ...
- 使用Kotlin开发Android应用(II):创建新工程
在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...
- python学习之路-第二天-常见的注意事项(代码风格、运算符、优先级、控制语句)
总结了今天学习几个注意事项: 对代码声明变量的时候没必要像以前写java或者c代码要声明数据类型,只需要赋值即可 代码一行基本只写一句逻辑行,而且尽量不在python里面写':' 明确的行连接'',暗 ...
- 内网IP&外网IP/NAT
内网的计算机以NAT(网络地址转换)协议,通过一个公共的网关访问Internet.内网的计算机可向Internet上的其他 计算机发送连接请求,但Internet上其他的计算机无法向内网的计算机发送连 ...
- 软件工作考核项(zcl)——
注意:这里没有对代码风格做要求,因为要代码走查! 考核项 考核标准 分数等级 需求规格说明书编写 主要用例图缺失 -1 主要软件界面设计图缺失 -1 主要功能清单项目缺失 -1 主要复 ...