基于RapidJSON的操作库
需要安装配置RapidJSON库
/*******************************************************************
* summery: 提供便捷的方法操作rapidjson
* author: hejl
* date: 2017-02-17
* description: 有效避免string(NULL), element=NULL, strdup(NULL)判断
******************************************************************/ #ifndef _JSON_HPP_
#define _JSON_HPP_
#include <string>
#include "document.h"
#include "rapidjson.h"
#include "prettywriter.h" using namespace rapidjson;
using std::string; /*****************************
关键字说明:
Object : json中的{key: value}形式类型
Array : json中的[e1, e2, e3]形式类型
Value : 对json数据类型的抽象,包括Object,Array,int,string,是Object和Array的基类
GetStr/GetInt : 获取json内部某一部分的字符串值,通通1st参数返回,最后一参数是父节点Value,
中间参数用于定位第几元素(参数类型是int)或指定key对应的值(参数类型是const char*) usage example:
Document doc;
char jsonstr[] = "{ \"key1\": 123, \"key2\": \"string value\", \"key3\": [100, 200, \"str300\"] }"
doc.Parse<0>(jsonstr.c_str());
if (doc.HasParseError()) { ... }
// get key2 string value
std::string val2;
int result = Rjson::GetValue(val2, "key2", &doc);
// get key1 integer value
int val1;
int result = Rjson::GetValue(val1, "key1", &doc);
// get array [1] integer of key3
int val3_1;
int result = Rjson::GetValue(val3_1, "key3", 1, &doc);
// get array [2] string of key3
string val3_2;
int result = Rjson::GetValue(val3_2, "key3", 2, &doc);
*****************************/ class Rjson
{
public:
static int GetValue(const Value** value, const char* name, const Value* parent)
{
if (parent && name && parent->IsObject())
{
Value::ConstMemberIterator itr = parent->FindMember(name);
if (itr != parent->MemberEnd())
{
*value = &(itr->value);
return ;
}
} return -;
} static int GetValue(const Value** value, int idx, const Value* parent)
{
if (parent && idx >= && parent->IsArray() && idx < (int)parent->Size())
{
*value = &( (*parent)[idx]);
return ;
} return -;
} template<typename T>
static int GetObject(const Value** value, T t, const Value* parent)
{
if ( == GetValue(value, t, parent) && (*value)->IsObject())
{
return ;
} *value = NULL;
return -;
} template<typename T>
static int GetArray(const Value** value, T t, const Value* parent)
{
if ( == GetValue(value, t, parent) && (*value)->IsArray())
{
return ;
} *value = NULL;
return -;
} template<typename T>
static int GetStr(string& str, T t, const Value* parent)
{
const Value* value = NULL;
if ( == GetValue(&value, t, parent) && value->IsString())
{
str = value->GetString();
return ;
} return -;
} template<typename T>
static int GetInt(int& n, T t, const Value* parent)
{
const Value* value = NULL;
if ( == GetValue(&value, t, parent) && value->IsInt())
{
n = value->GetInt();
return ;
} return -;
} /////////////////////////////////////////// template<typename T1, typename T2>
static int GetValue(const Value** value, T1 t1, T2 t2, const Value* parent)
{
const Value* tmpv = NULL;
int ret = GetValue(&tmpv, t1, parent);
if ( == ret)
{
return GetValue(value, t2, tmpv);
} return -;
} template<typename T1, typename T2>
static int GetObject(const Value** value, T1 t1, T2 t2, const Value* parent)
{
if ( == GetValue(value, t1, t2, parent) && (*value)->IsObject())
{
return ;
}
*value = NULL;
return -;
} template<typename T1, typename T2>
static int GetArray(const Value** value, T1 t1, T2 t2, const Value* parent)
{
if ( == GetValue(value, t1, t2, parent) && (*value)->IsArray())
{
return ;
}
*value = NULL;
return -;
} template<typename T1, typename T2>
static int GetStr(string& str, T1 t1, T2 t2, const Value* parent)
{
const Value* value = NULL;
if ( == GetValue(&value, t1, t2, parent) && value->IsString())
{
str = value->GetString();
return ;
} return -;
} template<typename T1, typename T2>
static int GetInt(int& n, T1 t1, T2 t2, const Value* parent)
{
const Value* value = NULL;
if ( == GetValue(&value, t1, t2, parent) && value->IsInt())
{
n = value->GetInt();
return ;
} return -;
} /////////////////////////////////////////////// static int ToString(string& str, const Value* node)
{
if (node)
{
StringBuffer sb;
Writer<StringBuffer> writer(sb); // PrettyWriter
node->Accept(writer);
str = sb.GetString();
return ;
} return -;
} static string ToString(const Value* node)
{
if (node)
{
StringBuffer sb;
Writer<StringBuffer> writer(sb); // PrettyWriter
node->Accept(writer);
return sb.GetString();
} return "";
}
}; #endif
基于RapidJSON的操作库的更多相关文章
- C++ 基于rapidjson对json字符串的进行序列化与反序列化
json字符串的解析以封装在我们开发过程中经常见到, 尤其在socket通信上面, 在一次项目中碰到json字符串的进行解析, 而公司有没有封装好的库, 于是就自己基于开源的库进行了一次封装, 接下是 ...
- 2014 年10个最佳的PHP图像操作库
2014 年10个最佳的PHP图像操作库 Thomas Boutell 以及众多的开发者创造了以GD图形库闻名的一个图形软件库,用于动态的图形计算. GD提供了对于诸如C, Perl, Pytho ...
- 2014 年10个最佳的PHP图像操作库--留着有用
Thomas Boutell 以及众多的开发者创造了以GD图形库闻名的一个图形软件库,用于动态的图形计算. GD提供了对于诸如C, Perl, Python, PHP, OCaml等等诸多编程语言的支 ...
- 10个最佳的PHP图像操作库
Thomas Boutell 以及众多的开发者创造了以GD图形库闻名的一个图形软件库,用于动态的图形计算. GD提供了对于诸如C, Perl, Python, PHP, OCaml等等诸多编程语言的支 ...
- 利用cocoapods创建基于git的私有库
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...
- 利用cocoapods创建基于git的私有库Spec Repo
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...
- IOTutility 一个轻量级的 IOT 基础操作库
IOTutility 一个轻量级的 IOT 基础操作库 Base utility for IOT devices, networking, controls etc... IOTutility 的目的 ...
- Element没更新了?Element没更新,基于El的扩展库更新
think-vuele 基于Vue和ElementUI框架进行整合二次开发的一个框架.提供一些elementUI没有的或当时没有的控件.优化了或简化了便于2B软件开发的一些控件 demo:http:/ ...
- php版的redis操作库predis操作大全
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/146.html predis是php连接redis的操作库,由于它完全使用 ...
随机推荐
- MySQL crash-safe replication(2):
MySQL数据库的成功离不开其replicaiton(复制),相对于Oracle DG和Microsoft SQL Server Log Shipping来说,其简单易上手,基本上1,2分钟内根据手册 ...
- 高通LCD的pwm背光驱动
发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭:测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平: 根据原理图: mpp是什么? ...
- Eclipse无法自动编译生成class文件
在Maven项目中,通常eclipse生成的class文件都会在target/classes文件夹下,但是有时候由于各种原因,classes下没有生成class文件,导致项目启动失败 . 大部分cla ...
- Python实例--12306的抢票功能
基础知识学习 目标: 通过python程序实现自动登录下单功能 知识点: Selenium + 云打码 + Python 学习链接: 1. Python学习--Selenium模块 2. Python ...
- 【转】MySQL双主一致性架构优化
[原文]https://www.toutiao.com/i6594414914838725133/ 一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能 ...
- mariadb启动报错:[ERROR] Can't start server : Bind on unix socket: Permission denied
今天mariadb总是启动不了,对于我来说是不能忍受的.然后前往日志文件查看报错信息,提示如下: 出错信息一共就这三行,没有报其他的错误.那只能从红色方框的地方开始入手了. 首先是百度去搜索原因是什么 ...
- 【9】python关于os模块与os.path的相关操作
---恢复内容开始--- #__author:"吉*佳" #date: 2018/10/20 0020 #function: # os模块知识点 import os # 获取平台名 ...
- JQUERY方法给TABLE动态增加行
比如设置table的id为tabvar trHTML = "<tr><td>...</td></tr>"$("#tab&q ...
- HTML5中的Canvas详解
什么是Canvas HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图形容器,您必须使用脚本来绘制图 ...
- BZOJ 1208 宠物收养所 set+二分
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1208 题目大意: 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠 ...