#pragma once
#include "Util.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/document.h" NAMESPACEBEGIN(DEF)
//参考 https ://github.com/qicosmos/SmartDB1.03/blob/master/JsonCpp.hpp
//做了部分修改
class RapidJsonWraptor {
typedef rapidjson::Writer<rapidjson::StringBuffer> JsonWriter;
public:
RapidJsonWraptor() :m_writer(m_buf) {}
~RapidJsonWraptor() {}
void WriteArrayKey(std::string Key) {
m_writer.Key(Key.c_str());
}
void StartArray() {
m_writer.StartArray();
} void EndArray() {
m_writer.EndArray();
} void StartObject()
{
m_writer.StartObject();
} void EndObject()
{
m_writer.EndObject();
} template<typename T>
void WriteJson(std::string& key, T&& value) {
m_writer.Key(key.c_str());
WriteValue(std::forward<T>(value));
} template<typename T>
void WriteJson(const char* key, T&& value) {
m_writer.String(key);
WriteValue(std::forward<T>(value));
}
template<typename T>
void WriteArrayContent(T&& value) {
WriteValue(std::forward<T>(value));
} const char* GetString()const {
return m_buf.GetString();
}
private:
template<typename V>
typename std::enable_if<std::is_same<V, int>::value>::type WriteValue(V value)
{
m_writer.Int(value);
} template<typename V>
typename std::enable_if<std::is_same<V, unsigned int>::value>::type WriteValue(V value)
{
m_writer.Uint(value);
} template<typename V>
typename std::enable_if<std::is_same<V, int64_t>::value>::type WriteValue(V value)
{
m_writer.Int64(value);
} template<typename V>
typename std::enable_if<std::is_floating_point<V>::value>::type WriteValue(V value)
{
m_writer.Double(value);
} template<typename V>
typename std::enable_if<std::is_same<V, bool>::value>::type WriteValue(V value)
{
m_writer.Bool(value);
} template<typename V>
typename std::enable_if<std::is_pointer<V>::value>::type WriteValue(V value)
{
m_writer.String(value);
} template<typename V>
typename std::enable_if<std::is_array<V>::value>::type WriteValue(V value)
{
m_writer.String(value);
} template<typename V>
typename std::enable_if<std::is_same<V, std::nullptr_t>::value>::type WriteValue(V value)
{
m_writer.Null();
} template<typename V>
typename std::enable_if<std::is_same<V, std::string>::value>::type WriteValue(V value)
{
m_writer.String(value.c_str());
}
private:
rapidjson::StringBuffer m_buf;
JsonWriter m_writer;
rapidjson::Document m_doc;
}; NAMESPACEEND

  

// UseRapidJsonSample.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <string>
#include "JsonStringTool.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/document.h" int main()
{
//生成
DEF::RapidJsonWraptor jsonw;
{
jsonw.StartObject();
jsonw.WriteJson("int", );
jsonw.WriteJson("bool", false);
std::string s = "string";
jsonw.WriteJson(s, s); jsonw.WriteArrayKey("arraySample1");
jsonw.StartArray();
jsonw.WriteArrayContent("");
jsonw.WriteArrayContent("");
jsonw.WriteArrayContent("");
jsonw.WriteArrayContent();
jsonw.WriteArrayContent();
jsonw.WriteArrayContent();
jsonw.EndArray();
jsonw.WriteJson("int", );
jsonw.WriteJson("bool", false);
jsonw.EndObject();
} std::string json_str = jsonw.GetString();
std::cout << json_str << std::endl; //修改json_str;
rapidjson::Document document;
document.Parse(json_str.c_str());
rapidjson::Value& new_string = document["string"];
new_string.SetString("new_string", strlen("new_string"), document.GetAllocator()); rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
document.Accept(writer);
std::cout << buffer.GetString() << std::endl; return ;
}

rapidjson 的封装学习的更多相关文章

  1. java封装学习

    封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问.把过程和数据包围起来,对数据的访问只能通过已定义的接口. 在java中通过关键字priva ...

  2. (转载)OC学习篇之---类的三大特性:封装,继承,多态

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...

  3. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  4. jquery的封装与对象学习

    1.封装学习 /// <reference path="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js" /> ...

  5. 【PCB】电子元件封装大全及封装常识

    电子元件封装大全及封装常识 电子元件封装大全及封装常识 一.什么叫封装封装,就是指把硅片上的电路管脚,用导线接引到外部接头处,以便与其它器件连接.封装形式是指安装半导体集成电路芯片用的外壳.它不仅起着 ...

  6. DHCP协议格式、DHCP服务搭建、DHCP协商交互过程入门学习

    相关学习资料 http://www.rfc-editor.org/rfc/rfc2131.txt http://baike.baidu.com/view/7992.htm?fromtitle=DHCP ...

  7. 慕课学习--OSI与TCP/IP网络协议

    **OSI:开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放 ...

  8. JavaWeb学习笔记(十八)—— DBUtils的使用

    一.DBUtils概述 1.1 什么是DBUtils commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbuti ...

  9. Mybatis框架入门

    Mybaits框架 一.什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了googl ...

随机推荐

  1. Appium1.6启动ios9.3报错Original error: Sdk '9.3.5' was not in list of simctl sdks

    问题: 使用Apppium1.6启动ios9.3报错Original error: Sdk '9.3.5' was not in list of simctl sdks   我的启动配置如下 {   ...

  2. Could not load conf for core new_core 解決方法

    new_core: org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: Could not load ...

  3. 【Scheme】元循环求值

    #lang scheme (require rnrs/base-6) (require rnrs/mutable-pairs-6) (define (eval exp env) (cond ((sel ...

  4. Java Web开发和Python Web开发之间的区别

    今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...

  5. 15种css居中方式

    1 水平居中 1.1 内联元素水平居中 利用 text-align: center 可以实现在块级元素内部的内联元素水平居中.此方法对内联元素(inline), 内联块(inline-block), ...

  6. pta l2-10(排座位)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805066135879680 题意:给宴席排座位,有n个人,m个 ...

  7. 设置获取cookie,setCookie,getCookie

    设置cookie: function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.getT ...

  8. Max Points on a Line (HASH TABLE

    QUESTIONGiven n points on a 2D plane, find the maximum number of points that lie on the same straigh ...

  9. TZOJ 3209 后序遍历(已知中序前序求后序)

    描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义:  ...

  10. [Codeforces_713A]Sonya and Queries

    题目链接 http://codeforces.com/problemset/problem/713/A 题意 三种操作: +  ai 集合里加一个整数ai,相同数记为多个.  -  ai 集合里减一个 ...