nodemanager/utils/JsonHelper.cpp (38 lines of code) (raw):
#include "JsonHelper.h"
namespace hpc
{
/// FromJson/ToJson specializations.
namespace utils
{
#define FROMJSON(T, Check, Fetch) \
template <> \
T JsonHelper<T>::FromJson(const json::value& j) \
{ \
if (!j.is_null() && j.Check) { return j.Fetch; } \
throw std::runtime_error("cannot get value from json object"); \
}
#define FROMJSON_DEFAULT(T, Check, Fetch, Default) \
template <> \
T JsonHelper<T>::FromJson(const json::value& j) \
{ \
if (!j.is_null() && j.Check) { return j.Fetch; } \
else { return std::move(Default); } \
}
FROMJSON(int, is_number(), as_integer())
FROMJSON(long, is_number(), as_number().to_int64())
FROMJSON_DEFAULT(std::string, is_string(), as_string(), std::string())
FROMJSON(const json::array&, is_array(), as_array())
FROMJSON(long long, is_number(), as_number().to_int64())
FROMJSON(uint64_t, is_number(), as_number().to_uint64())
FROMJSON(double, is_number(), as_number().to_double())
FROMJSON_DEFAULT(bool, is_boolean(), as_bool(), false)
FROMJSON(const json::object&, is_object(), as_object())
#define TOJSON(T, JsonType) \
template <> \
json::value JsonHelper<T>::ToJson(const T& val) { return json::value::JsonType(val); }
TOJSON(int, number)
TOJSON(double, number)
TOJSON(uint64_t, number)
TOJSON(bool, boolean)
TOJSON(std::string, string)
}
}