nodemanager/utils/JsonHelper.h (120 lines of code) (raw):
#ifndef JSONHELPER_H
#define JSONHELPER_H
#include <vector>
#include <map>
#include <cpprest/json.h>
using namespace web;
namespace hpc
{
namespace utils
{
template <typename T>
class JsonHelper
{
public:
static T Read(const std::string& name, const json::value& j)
{
json::value obj;
if (j.has_field(name))
{
obj = j.at(name);
}
return JsonHelper<T>::FromJson(obj);
}
static void Write(const std::string& name, json::value& v, const T& t)
{
v[name] = ToJson(t);
}
static T FromJson(const json::value& j);
static json::value ToJson(const T& t);
protected:
private:
};
// Partial specialize for vector.
template <typename T>
class JsonHelper<std::vector<T>>
{
public:
static std::vector<T> Read(const std::string& name, const json::value& j)
{
json::value obj;
if (j.has_field(name))
{
obj = j.at(name);
}
return JsonHelper<std::vector<T>>::FromJson(obj);
}
static std::vector<T> FromJson(const json::value& j)
{
std::vector<T> values;
if (!j.is_null())
{
auto arr = JsonHelper<const json::array&>::FromJson(j);
std::transform(
arr.cbegin(),
arr.cend(),
std::back_inserter(values),
[](const auto& i) { return JsonHelper<T>::FromJson(i); });
}
return std::move(values);
}
static json::value ToJson(const std::vector<T>& vec)
{
std::vector<json::value> values;
std::transform(
vec.cbegin(),
vec.cend(),
std::back_inserter(values),
[](const T& v) { return JsonHelper<T>::ToJson(v); });
return json::value::array(values);
}
static void Write(const std::string& name, json::value& v, const std::vector<T>& t)
{
v[name] = ToJson(t);
}
protected:
private:
};
// Partial specialize for map.
template <typename T>
class JsonHelper<std::map<std::string, T>>
{
public:
static std::map<std::string, T> Read(const std::string& name, const json::value& j)
{
json::value obj;
if (j.has_field(name))
{
obj = j.at(name);
}
return std::move(JsonHelper<std::map<std::string, T>>::FromJson(obj));
}
static std::map<std::string, T> FromJson(const json::value& j)
{
std::map<std::string, T> values;
if (!j.is_null())
{
const auto& arr = JsonHelper<const json::object&>::FromJson(j);
for (auto const i : arr)
{
values[i.first] = JsonHelper<T>::FromJson(i.second);
}
}
return std::move(values);
}
static json::value ToJson(const std::map<std::string, T>& m)
{
json::value v;
std::for_each(
m.cbegin(),
m.cend(),
[&v](const std::pair<std::string, T>& p)
{
v[p.first] = JsonHelper<T>::ToJson(p.second);
});
return std::move(v);
}
// static void Write(const std::string& name, json::value& v, const std::vector<T>& t);
protected:
private:
};
}
}
#endif // JSONHELPER_H