19 #include "IqrfLogging.h" 20 #include "rapidjson/rapidjson.h" 21 #include "rapidjson/document.h" 22 #include "rapidjson/istreamwrapper.h" 23 #include "rapidjson/stringbuffer.h" 24 #include "rapidjson/prettywriter.h" 40 inline void parseJsonFile(
const std::string& fname, rapidjson::Document& json)
42 std::ifstream ifs(fname);
44 THROW_EX(std::logic_error,
"Cannot open: " << PAR(fname));
47 rapidjson::IStreamWrapper isw(ifs);
48 json.ParseStream(isw);
50 if (json.HasParseError()) {
51 THROW_EX(std::logic_error,
"Json parse error: " << NAME_PAR(emsg, json.GetParseError()) <<
52 NAME_PAR(eoffset, json.GetErrorOffset()));
63 inline void parseIstream(std::istream& istr, rapidjson::Document& json)
65 rapidjson::IStreamWrapper isw(istr);
66 json.ParseStream(isw);
68 if (json.HasParseError()) {
69 THROW_EX(std::logic_error,
"Json parse error: " << NAME_PAR(emsg, json.GetParseError()) <<
70 NAME_PAR(eoffset, json.GetErrorOffset()));
83 rapidjson::StringStream s(str.data());
84 rapidjson::Document doc;
87 if (json.HasParseError()) {
88 THROW_EX(std::logic_error,
"Json parse error: " << NAME_PAR(emsg, json.GetParseError()) <<
89 NAME_PAR(eoffset, json.GetErrorOffset()));
100 inline void assertIs(
const std::string& name,
const rapidjson::Value& v) {
102 THROW_EX(std::logic_error,
"Expected: " <<
typeid(T).name() <<
", detected: " << PAR(name) << NAME_PAR(
type, v.GetType()));
114 inline void assertIs<std::string>(
const std::string& name,
const rapidjson::Value& v) {
116 THROW_EX(std::logic_error,
"Expected: " <<
typeid(std::string).name() <<
", detected: " << PAR(name) << NAME_PAR(
type, v.GetType()));
129 THROW_EX(std::logic_error,
"Expected: Json Object, detected: " << PAR(name) << NAME_PAR(
type, v.GetType()));
138 inline void assertIsArray(
const std::string& name,
const rapidjson::Value& v)
141 THROW_EX(std::logic_error,
"Expected: Json Array, detected: " << PAR(name) << NAME_PAR(
type, v.GetType()));
151 inline const rapidjson::Value::ConstMemberIterator
getMember(
const std::string& name,
const rapidjson::Value& jsonValue)
153 const rapidjson::Value::ConstMemberIterator m = jsonValue.FindMember(name.c_str());
154 if (m == jsonValue.MemberEnd()) {
155 THROW_EX(std::logic_error,
"Expected member: " << PAR(name));
169 inline T
getMemberAs(
const std::string& name,
const rapidjson::Value& v) {
171 assertIs<T>(name, m->value);
172 return m->value.Get<T>();
185 inline std::string getMemberAs<std::string>(
const std::string& name,
const rapidjson::Value& v) {
187 assertIs<std::string>(name, m->value);
188 return std::string(m->value.GetString());
199 inline const rapidjson::Value&
getMemberAsObject(
const std::string& name,
const rapidjson::Value& v)
217 std::vector<T> retval;
219 const rapidjson::Value& vct = m->value;
222 for (
auto itr = vct.Begin(); itr != vct.End(); ++itr) {
223 assertIs<T>(name, *itr);
224 retval.push_back(itr->Get<T>());
240 inline std::vector<std::string> getMemberAsVector<std::string>(
const std::string& name,
const rapidjson::Value& v)
242 std::vector<std::string> retval;
244 const rapidjson::Value& vct = m->value;
247 for (
auto itr = vct.Begin(); itr != vct.End(); ++itr) {
248 assertIs<std::string>(name, *itr);
249 retval.push_back(std::string(itr->GetString()));
266 const auto m = v.FindMember(name.c_str());
267 if (m == v.MemberEnd()) {
270 assertIs<T>(name, m->value);
271 return m->value.Get<T>();
285 inline std::string getPossibleMemberAs<std::string>(
const std::string& name,
const rapidjson::Value& v, std::string defaultVal) {
286 const auto m = v.FindMember(name.c_str());
287 if (m == v.MemberEnd()) {
290 assertIs<std::string>(name, m->value);
291 return std::string(m->value.GetString());
304 inline std::vector<T>
getPossibleMemberAsVector(
const std::string& name,
const rapidjson::Value& v, std::vector<T> defaultVal = std::vector<T>())
306 const auto m = v.FindMember(name.c_str());
307 if (m == v.MemberEnd())
310 const rapidjson::Value& vct = m->value;
314 for (
auto itr = vct.Begin(); itr != vct.End(); ++itr) {
315 assertIs<T>(name, *itr);
316 defaultVal.push_back(itr->Get<T>());
333 const auto m = v.FindMember(name.c_str());
334 if (m == v.MemberEnd()) {
337 assertIs<T>(name, m->value);
338 member = m->value.Get<T>();
353 inline bool getMemberIfExistsAs<std::string>(
const std::string& name,
const rapidjson::Value& v, std::string& member) {
354 const auto m = v.FindMember(name.c_str());
355 if (m == v.MemberEnd()) {
358 assertIs<std::string>(name, m->value);
359 member = m->value.GetString();
void assertIsArray(const std::string &name, const rapidjson::Value &v)
Assert json value holds Json array.
Definition: JsonUtils.h:138
void parseString(const std::string &str, rapidjson::Document &json)
Parse string with Json content.
Definition: JsonUtils.h:81
const rapidjson::Value & getMemberAsObject(const std::string &name, const rapidjson::Value &v)
Get member with value of type Json object.
Definition: JsonUtils.h:199
const rapidjson::Value::ConstMemberIterator getMember(const std::string &name, const rapidjson::Value &jsonValue)
Get rapidjson member iterator.
Definition: JsonUtils.h:151
std::vector< T > getPossibleMemberAsVector(const std::string &name, const rapidjson::Value &v, std::vector< T > defaultVal=std::vector< T >())
Get possible member with std::vector of values of template type T.
Definition: JsonUtils.h:304
std::vector< T > getMemberAsVector(const std::string &name, const rapidjson::Value &v)
Get member with value std::vector of values of template type T.
Definition: JsonUtils.h:215
void assertIsObject(const std::string &name, const rapidjson::Value &v)
Assert json value holds Json object.
Definition: JsonUtils.h:126
str
Definition: build.py:27
type
Definition: build.py:27
T getMemberAs(const std::string &name, const rapidjson::Value &v)
Get member with value of type T.
Definition: JsonUtils.h:169
void parseIstream(std::istream &istr, rapidjson::Document &json)
Parse stream with Json content.
Definition: JsonUtils.h:63
void assertIs(const std::string &name, const rapidjson::Value &v)
Assert json value holds T type.
Definition: JsonUtils.h:100
Rapid Json values manipulation functions.
void parseJsonFile(const std::string &fname, rapidjson::Document &json)
Parse file with Json content.
Definition: JsonUtils.h:40
T getPossibleMemberAs(const std::string &name, const rapidjson::Value &v, T defaultVal)
Get possible member with value of type T.
Definition: JsonUtils.h:265
bool getMemberIfExistsAs(const std::string &name, const rapidjson::Value &v, T &member)
Get member value if exists of template type T.
Definition: JsonUtils.h:332