zoukankan      html  css  js  c++  java
  • rapidjson 的封装学习

    #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", 1);
            jsonw.WriteJson("bool", false);
            std::string s = "string";
            jsonw.WriteJson(s, s);
    
            jsonw.WriteArrayKey("arraySample1");
            jsonw.StartArray();
            jsonw.WriteArrayContent("1");
            jsonw.WriteArrayContent("2");
            jsonw.WriteArrayContent("3");
            jsonw.WriteArrayContent(1);
            jsonw.WriteArrayContent(2);
            jsonw.WriteArrayContent(3);
            jsonw.EndArray();
            jsonw.WriteJson("int", 1);
            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 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    python学习笔记 day28 内置函数进阶实例
    python学习笔记 day28 面向对象的进阶
    python学习笔记 day27 内置方法
    python学习笔记 day27 反射(二)
    python学习笔记 day26 反射-----hasattr getattr delattr
    python学习笔记 day26 类方法classmethod 和 静态方法 staticmethod ---------都是面向对象的内置函数(装饰器)
    python学习笔记 day26 私有属性 和 property
    python学习笔记 day25 封装
    python学习笔记 day25 多态
    #Leetcode# 728. Self Dividing Numbers
  • 原文地址:https://www.cnblogs.com/itdef/p/7783145.html
Copyright © 2011-2022 走看看