json::rapidjson工具
源码地址: https://github.com/Tencent/rapidjson
可跨平台使用。
将 rapidjson-master\include\rapidjson 中的 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; }