1. #pragma once
  2. #include "Util.h"
  3. #include "rapidjson/writer.h"
  4. #include "rapidjson/stringbuffer.h"
  5. #include "rapidjson/document.h"
  6.  
  7. NAMESPACEBEGIN(DEF)
  8. //参考 https ://github.com/qicosmos/SmartDB1.03/blob/master/JsonCpp.hpp
  9. //做了部分修改
  10. class RapidJsonWraptor {
  11. typedef rapidjson::Writer<rapidjson::StringBuffer> JsonWriter;
  12. public:
  13. RapidJsonWraptor() :m_writer(m_buf) {}
  14. ~RapidJsonWraptor() {}
  15. void WriteArrayKey(std::string Key) {
  16. m_writer.Key(Key.c_str());
  17. }
  18. void StartArray() {
  19. m_writer.StartArray();
  20. }
  21.  
  22. void EndArray() {
  23. m_writer.EndArray();
  24. }
  25.  
  26. void StartObject()
  27. {
  28. m_writer.StartObject();
  29. }
  30.  
  31. void EndObject()
  32. {
  33. m_writer.EndObject();
  34. }
  35.  
  36. template<typename T>
  37. void WriteJson(std::string& key, T&& value) {
  38. m_writer.Key(key.c_str());
  39. WriteValue(std::forward<T>(value));
  40. }
  41.  
  42. template<typename T>
  43. void WriteJson(const char* key, T&& value) {
  44. m_writer.String(key);
  45. WriteValue(std::forward<T>(value));
  46. }
  47. template<typename T>
  48. void WriteArrayContent(T&& value) {
  49. WriteValue(std::forward<T>(value));
  50. }
  51.  
  52. const char* GetString()const {
  53. return m_buf.GetString();
  54. }
  55. private:
  56. template<typename V>
  57. typename std::enable_if<std::is_same<V, int>::value>::type WriteValue(V value)
  58. {
  59. m_writer.Int(value);
  60. }
  61.  
  62. template<typename V>
  63. typename std::enable_if<std::is_same<V, unsigned int>::value>::type WriteValue(V value)
  64. {
  65. m_writer.Uint(value);
  66. }
  67.  
  68. template<typename V>
  69. typename std::enable_if<std::is_same<V, int64_t>::value>::type WriteValue(V value)
  70. {
  71. m_writer.Int64(value);
  72. }
  73.  
  74. template<typename V>
  75. typename std::enable_if<std::is_floating_point<V>::value>::type WriteValue(V value)
  76. {
  77. m_writer.Double(value);
  78. }
  79.  
  80. template<typename V>
  81. typename std::enable_if<std::is_same<V, bool>::value>::type WriteValue(V value)
  82. {
  83. m_writer.Bool(value);
  84. }
  85.  
  86. template<typename V>
  87. typename std::enable_if<std::is_pointer<V>::value>::type WriteValue(V value)
  88. {
  89. m_writer.String(value);
  90. }
  91.  
  92. template<typename V>
  93. typename std::enable_if<std::is_array<V>::value>::type WriteValue(V value)
  94. {
  95. m_writer.String(value);
  96. }
  97.  
  98. template<typename V>
  99. typename std::enable_if<std::is_same<V, std::nullptr_t>::value>::type WriteValue(V value)
  100. {
  101. m_writer.Null();
  102. }
  103.  
  104. template<typename V>
  105. typename std::enable_if<std::is_same<V, std::string>::value>::type WriteValue(V value)
  106. {
  107. m_writer.String(value.c_str());
  108. }
  109. private:
  110. rapidjson::StringBuffer m_buf;
  111. JsonWriter m_writer;
  112. rapidjson::Document m_doc;
  113. };
  114.  
  115. NAMESPACEEND

  

  1. // UseRapidJsonSample.cpp: 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <string>
  7. #include "JsonStringTool.h"
  8. #include "rapidjson/writer.h"
  9. #include "rapidjson/stringbuffer.h"
  10. #include "rapidjson/document.h"
  11.  
  12. int main()
  13. {
  14. //生成
  15. DEF::RapidJsonWraptor jsonw;
  16. {
  17. jsonw.StartObject();
  18. jsonw.WriteJson("int", );
  19. jsonw.WriteJson("bool", false);
  20. std::string s = "string";
  21. jsonw.WriteJson(s, s);
  22.  
  23. jsonw.WriteArrayKey("arraySample1");
  24. jsonw.StartArray();
  25. jsonw.WriteArrayContent("");
  26. jsonw.WriteArrayContent("");
  27. jsonw.WriteArrayContent("");
  28. jsonw.WriteArrayContent();
  29. jsonw.WriteArrayContent();
  30. jsonw.WriteArrayContent();
  31. jsonw.EndArray();
  32. jsonw.WriteJson("int", );
  33. jsonw.WriteJson("bool", false);
  34. jsonw.EndObject();
  35. }
  36.  
  37. std::string json_str = jsonw.GetString();
  38. std::cout << json_str << std::endl;
  39.  
  40. //修改json_str;
  41. rapidjson::Document document;
  42. document.Parse(json_str.c_str());
  43. rapidjson::Value& new_string = document["string"];
  44. new_string.SetString("new_string", strlen("new_string"), document.GetAllocator());
  45.  
  46. rapidjson::StringBuffer buffer;
  47. rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
  48. document.Accept(writer);
  49. std::cout << buffer.GetString() << std::endl;
  50.  
  51. return ;
  52. }

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. Android Studio: Application Installation Failed

    [Android Studio: Application Installation Failed] 参考:http://stackoverflow.com/questions/32718044/and ...

  2. spark快速开发之scala基础之3类,对象,特征

    类 scala的类定义非常灵活 class test4 class test2{} class test3(x:Int) 定义一个带构造函数的类 class Point (x : Int,y : In ...

  3. 织梦 百度sitemap制作教程

    一.新建一个sitemap.htm模板 登录dedecms后台,选择[模板]-[模板管理]-[默认模板管理] 点击最下面的[新建模板]新建一个模板,并复制下面这段代码进去(将代码中的域名改为自己的): ...

  4. poj 1170状压dp

    题目链接:https://vjudge.net/problem/POJ-1170 题意:输入n,表示有那种物品,接下来n行,每行a,b,c三个变量,a表示物品种类,b是物品数量,c代表物品的单价.接下 ...

  5. delet[] 和delete

    string *stringPtr1 = new string; string *stringPtr2 = new string[100]; …… delete stringPtr1; delete ...

  6. Django的model操作中一些常用的小点

    一.django的orm的13种基本的查询方法 1.all方法,查询某张表中的所有的数据 user_obj_list = models.Person.objects.all() 返回的结果是query ...

  7. swift - 指定VC隐藏导航栏 - 禁用tabbar的根控制器手势,防止两个tabbar跳转 手势冲突

    1. viewdidload 设置代理 self.navigationController?.delegate = self 2.代理里面指定VC 隐藏 //MARK: - 导航栏delegate e ...

  8. python颜色及背景

    linux终端中的颜色是用转义序列控制的,转义序列是以ESC开头,可以用\033完成相同的工作(ESC的ASCII码用十进制表示就是27,等于用八进制表示的33). 书写格式,和相关说明如下: 1 2 ...

  9. golang语言中os包的学习与使用(文件,目录,进程的操作)

    os中一些常用函数的使用: package main; import ( "os" "fmt" "time" "strings&q ...

  10. 移动端页面返回,数据不刷新bug解决

    一,当安卓和ios都有问题的时候 // a.html 设置刷新 检测缓存是否有标志 要是有就说明数据有变化 a.html跳转到b.html页面 window.addEventListener(&quo ...