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;
    }
  • 相关阅读:
    【模拟】HDU 5752 Sqrt Bo
    【数学】HDU 5753 Permutation Bo
    【模拟】Codeforces 706A Beru-taxi
    【二分】Codeforces 706B Interesting drink
    【动态规划】Codeforces 706C Hard problem
    【字典树】【贪心】Codeforces 706D Vasiliy's Multiset
    【中国剩余定理】POJ 1006 & HDU 1370 Biorhythms
    计算机存储单位
    转载_Linux下查看文件和文件夹大小
    反问题_不适定_正则化
  • 原文地址:https://www.cnblogs.com/osbreak/p/11376956.html
Copyright © 2011-2022 走看看