如何在 Poco C++ 中无异常捕获地区分对象和数组
How to distinguish Object from Array in Poco C++ without exception catch
我们已经知道,我们使用下面的代码来解析json数据
std::string jsonString = "{\"aa\":\"bb\"}";
Poco::JSON::Parser parser;
Poco::Dynamic::Var result;
result = parser.parse(jsonString);
Poco::JSON::Object::Ptr pObj = result.extract<Poco::JSON::Object::Ptr>();
... // goes with pObj
我们知道"{\"aa\":\"bb\"}"是json对象,所以我们使用result.extract
和以下用于解析 json 数组数据的代码
std::string jsonString = "[{\"aa\":\"bb\"}, {\"cc\":\"dd\"}]";
Poco::JSON::Parser parser;
Poco::Dynamic::Var result;
result = parser.parse(jsonString);
Poco::JSON::Array::Ptr pArr = result.extract<Poco::JSON::Array::Ptr>();
... // goes with pArr
我们知道 "[{\"aa\":\"bb\"}, {\"cc\":\"dd\"}]", 所以我们使用 result.extract
所以,我的第一个想法是:
...
try {
Poco::JSON::Object::Ptr pObj = result.extract<Poco::JSON::Object::Ptr>(); // this does be a json object
} catch (...) {}
try {
Poco::JSON::Array::Ptr pArr = result.extract<Poco::JSON::Array::Ptr>(); // this does be a json array
} catch (...) {}
...
然后,使用上面的异常捕获代码,我可以区分对象和数组。
那么,有没有什么办法可以无一例外地解决这类问题呢?
使用C++的类型信息解决这个问题
std::string jsonString = "[{\"aa\":\"bb\"}, {\"cc\":\"dd\"}]";
// or std::string jsonString = "{{\"aa\":\"bb\"}, {\"cc\":\"dd\"}}";
try {
result = parser.parse(jsonString);
} catch (Poco::SyntaxException & e) {
std::cout << "This is not a valid json data" << std::endl;
return;
}
Poco::JSON::Array::Ptr p;
if (typeid(p) == result.type()) {
std::cout << "This is a arry" << std::endl;
} else {
std::cout << "This is a object" << std::endl;
}
我们已经知道,我们使用下面的代码来解析json数据
std::string jsonString = "{\"aa\":\"bb\"}";
Poco::JSON::Parser parser;
Poco::Dynamic::Var result;
result = parser.parse(jsonString);
Poco::JSON::Object::Ptr pObj = result.extract<Poco::JSON::Object::Ptr>();
... // goes with pObj
我们知道"{\"aa\":\"bb\"}"是json对象,所以我们使用result.extract
和以下用于解析 json 数组数据的代码
std::string jsonString = "[{\"aa\":\"bb\"}, {\"cc\":\"dd\"}]";
Poco::JSON::Parser parser;
Poco::Dynamic::Var result;
result = parser.parse(jsonString);
Poco::JSON::Array::Ptr pArr = result.extract<Poco::JSON::Array::Ptr>();
... // goes with pArr
我们知道 "[{\"aa\":\"bb\"}, {\"cc\":\"dd\"}]", 所以我们使用 result.extract
所以,我的第一个想法是:
...
try {
Poco::JSON::Object::Ptr pObj = result.extract<Poco::JSON::Object::Ptr>(); // this does be a json object
} catch (...) {}
try {
Poco::JSON::Array::Ptr pArr = result.extract<Poco::JSON::Array::Ptr>(); // this does be a json array
} catch (...) {}
...
然后,使用上面的异常捕获代码,我可以区分对象和数组。
那么,有没有什么办法可以无一例外地解决这类问题呢?
使用C++的类型信息解决这个问题
std::string jsonString = "[{\"aa\":\"bb\"}, {\"cc\":\"dd\"}]";
// or std::string jsonString = "{{\"aa\":\"bb\"}, {\"cc\":\"dd\"}}";
try {
result = parser.parse(jsonString);
} catch (Poco::SyntaxException & e) {
std::cout << "This is not a valid json data" << std::endl;
return;
}
Poco::JSON::Array::Ptr p;
if (typeid(p) == result.type()) {
std::cout << "This is a arry" << std::endl;
} else {
std::cout << "This is a object" << std::endl;
}