zoukankan      html  css  js  c++  java
  • json::rapidjson工具

    源码地址: https://github.com/Tencent/rapidjson 
    可跨平台使用。
    将 rapidjson-masterinclude apidjson 中的 rapidjson 文件夹添加到 项目中 即可。
    #pragma once
    #include <type_traits>
    #include <rapidjson/error/en.h>
    #include <rapidjson/document.h>
    #include <rapidjson/stringbuffer.h>
    #include <rapidjson/prettywriter.h>
    #include <rapidjson/reader.h>
    #include <rapidjson/error/en.h>
    
    
    #ifndef _WIN32
    template<bool _Test,
        class _Ty = void>
        using enable_if_t = typename std::enable_if<_Test, _Ty>::type;
    #else
        using std::enable_if_t;
    #endif
    
    template<typename T>
    enable_if_t<(std::is_same<std::string, T>::value || std::is_same<const char*, T>::value), bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsString())
            return false;
    
        r = v.Get<T>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<int, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsInt())
            return false;
    
        r = v.Get<T>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<int64_t, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsInt64())
            return false;
    
        r = v.Get<T>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<uint32_t, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsUint())
            return false;
    
        r = v.Get<T>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<uint16_t, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsUint())
            return false;
    
        r = v.Get<uint32_t>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<int16_t, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsInt())
            return false;
    
        r = v.Get<int>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<uint64_t, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsUint64())
            return false;
    
        r = v.Get<T>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<double, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsDouble())
            return false;
    
        r = v.Get<T>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<float, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsFloat())
            return false;
    
        r = v.Get<T>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<rapidjson::Value::Object, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsObject())
            return false;
    
        r = v.Get<T>();
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<rapidjson::Value*, T>::value, bool>
    safe_get_json_val(rapidjson::Value& v, T& r)
    {
        r = &v;
        return true;
    }
    
    template<typename T>
    enable_if_t<std::is_same<rapidjson::Value::Array, T>::value, bool>
    safe_get_json_val(const rapidjson::Value& v, T& r)
    {
        if (!v.IsArray())
            return false;
    
        r = v.Get<T>();
        return true;
    }
    
    
    template<typename T>
    bool safe_get_json_member(rapidjson::Value& v, const char* field, T& r)
    {
        if (!v.HasMember(field))
            return false;
    
        return safe_get_json_val(v[field], r);
    }
    std::string Json2str()
    {
        std::lock_guard<mutex> lck(m_mx);
        Document doc;
        doc.SetObject();
    
        Document::AllocatorType& allocator = doc.GetAllocator();
    
        Value base(rapidjson::kObjectType);
        
        base.AddMember("SnapPicturePath", StringRef(m_bc.SnapPicturePath.c_str()), allocator);
        base.AddMember("vehThreadNum", StringRef(m_bc.vehThreadNum.c_str()), allocator);
        base.AddMember("vehUrl", StringRef(m_bc.vehUrl.c_str()), allocator);
        base.AddMember("cmsUrl", StringRef(m_bc.cmsUrl.c_str()), allocator);
        
        doc.AddMember("base", base, allocator);
        rapidjson::StringBuffer buffer;
        rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
        doc.Accept(writer);
    
        return buffer.GetString();
    }
    bool str2json(const string str, string& outHexImage, string& confidence)
    {
        Document doc;
        doc.Parse<0>(json.c_str());
        if (doc.HasParseError()) {
            return false;
        }
    
        Value* pValue = nullptr;
        Value* Value = nullptr;
        if (safe_get_json_member(doc, "result", pValue))
        {
            if(safe_get_json_member(*pValue, "image", Value))
                outHexImage = Value->GetString();
            if(safe_get_json_member(*pValue, "confidence", Value))
                confidence = Value->GetString();
        }
        return true;
    }
  • 相关阅读:
    前端性能优化-基础认知
    AngularJS表单验证开发案例
    信息无缝滚动效果marquee
    好用的切换滑动焦点图框架jquery.superslide
    jQuery核心探究
    焦点图轮播图原理与机制
    删除数组中指定的某个元素
    伪响应式开发(PC和Mobile分离)
    18丨CentOS:操作系统级监控及常用计数器解析(下)
    17丨CentOS:操作系统级监控及常用计数器解析
  • 原文地址:https://www.cnblogs.com/osbreak/p/11376956.html
Copyright © 2011-2022 走看看