#ifndef rapidjson_utils_h__
#define rapidjson_utils_h__
#include "rapidjson/rapidjson.h"
#include "rapidjson/document.h"
#include "rapidjson/pointer.h"
#include "rapidjson/writer.h"
#include "rapidjson/prettywriter.h"
#include "rapidjson/error/en.h"
#include <string>
namespace MyJson
{
using std::string;
static int get_rapidjson_string(const rapidjson::Value& js_in,
std::string key,
std::string& value) {
rapidjson::Pointer pointer(key.c_str());
if (!pointer.IsValid()) {
return -1;
}
const rapidjson::Value *pValue = rapidjson::GetValueByPointer(js_in, pointer);
if (NULL == pValue || !pValue->IsString()) {
return -1;
}
value = pValue->GetString();
return 0;
}
static int get_rapidjson_int(const rapidjson::Value& js_in,
std::string key,
int& value) {
rapidjson::Pointer pointer(key.c_str());
if (!pointer.IsValid()) {
return -1;
}
const rapidjson::Value *pValue = rapidjson::GetValueByPointer(js_in, pointer);
if (NULL == pValue || !pValue->IsNumber()) {
return -1;
}
value = pValue->GetInt();
return 0;
}
static int get_rapidjson_number(const rapidjson::Value& js_in,
std::string key,
float& value) {
rapidjson::Pointer pointer(key.c_str());
if (!pointer.IsValid()) {
return -1;
}
const rapidjson::Value *pValue = rapidjson::GetValueByPointer(js_in, pointer);
if (NULL == pValue || !pValue->IsNumber()) {
return -1;
}
rapidjson::Type valueType = pValue->GetType();
switch (valueType) {
case rapidjson::Type::kNumberType:
value = pValue->GetDouble();
break;
default:
return -1;
}
return 0;
}
static int get_rapidjson_bool(const rapidjson::Value& js_in,
std::string key,
bool& value) {
rapidjson::Pointer pointer(key.c_str());
if (!pointer.IsValid()) {
return -1;
}
const rapidjson::Value *pValue = rapidjson::GetValueByPointer(js_in, pointer);
if (NULL == pValue || !pValue->IsBool()) {
return -1;
}
value = pValue->GetBool();
return 0;
}
static void add_member_string(rapidjson::Value& node, string key, string value, rapidjson::Document::AllocatorType &alloc) {
node.AddMember(rapidjson::Value(key.c_str(), key.length(), alloc).Move(),
rapidjson::Value(value.c_str(), value.length(), alloc).Move(), alloc);
}
static void add_member_int(rapidjson::Value& node, string key, int value,
rapidjson::Document::AllocatorType &alloc) {
node.AddMember(rapidjson::Value(key.c_str(), key.length(), alloc).Move(),
rapidjson::Value(value).Move(), alloc);
}
static void add_member_float(rapidjson::Value& node, string key, double value,
rapidjson::Document::AllocatorType &alloc) {
node.AddMember(rapidjson::Value(key.c_str(), key.length(), alloc).Move(),
rapidjson::Value(value).Move(), alloc);
}
static void add_member_bool(rapidjson::Value& node, string key, bool value,
rapidjson::Document::AllocatorType &alloc) {
node.AddMember(rapidjson::Value(key.c_str(), key.length(), alloc).Move(),
rapidjson::Value(value).Move(), alloc);
}
static string to_string(const rapidjson::Value& v) {
rapidjson::StringBuffer sb;
rapidjson::Writer<rapidjson::StringBuffer> writer(sb);
v.Accept(writer);
std::string sResult = sb.GetString();
return sResult;
}
static string to_styled_string(const rapidjson::Value& v) {
rapidjson::StringBuffer sb;
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
v.Accept(writer);
std::string s = sb.GetString();
return s;
}
}
#endif