• 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;
    }
  • 相关阅读:
    java设计模式笔记(1)-适配器模式
    linux下源码编译安装mysql
    spring boot入门
    2016年终总结
    CentOS获取公网IP
    shell中的$0 $n $# $* $@ $? $$
    shell中各种括号的作用详解()、(())、[]、[[]]、{}
    10个实战及面试常用Linux Shell脚本编写
    记录centos下nl与cat -n的不同
    grep、cut、awk、sed的使用
  • 原文地址:https://www.cnblogs.com/osbreak/p/11376956.html
Copyright © 2020-2023  润新知