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;
}
原文地址:https://www.cnblogs.com/osbreak/p/11376956.html