我正在使用nlohmann::json
来解析json字符串。我实现了一个util函数GetValue()
来检索对象字段。
template<typename T1, typename T2>
bool CheckType(T1& it, T2& val) { return false; }
template<typename T1>
bool CheckType(T1& it, bool& val) { return it->is_boolean(); }
template<typename T1>
bool CheckType(T1& it, std::string& val) { return it->is_string(); }
....
template<typename T>
bool GetValue(nlohmann::json obj, std::string key, T& value, std::string &err) {
auto it = obj.find(key);
if (it != obj.end()) {
if (CheckType(it, val)) {
value = it->get<T>();
return true;
} else {
err = key + " type error";
}
} else {
err = key + " not found";
}
return false;
}
函数CheckType()
看起来很丑。做到这一点的优雅方法是什么?
答案 0 :(得分:1)
不确定,但是如果get()
支持在类型错误的情况下进行抛出,对我来说,写起来更简单
template<typename T>
bool GetValue(nlohmann::json obj, std::string key, T& value, std::string &err) {
auto it = obj.find(key);
if (it != obj.end()) {
try {
value = it->get<T>();
return true;
}
catch (...) { // catching the correct exception; see library documentation
err = key + " type error";
}
} else
err = key + " not found";
return false;
}
完全避免使用CheckType()
函数。