Как отличить guish объект от массива в Poco C ++ без исключения catch - PullRequest
0 голосов
/ 06 апреля 2020

Как мы уже знаем, мы используем следующий код для разбора json data

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 (...) {}
...

Затем, используя приведенный выше код с catch для исключения, я могу отличить guish Object от Array.

Итак, есть ли способ решить этот вопрос без catch catch?

1 Ответ

0 голосов
/ 29 апреля 2020

Используйте информацию о типе 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;
}
...