如何在Poco C ++中将对象与数组区分开来,没有异常捕获

问题描述 投票:0回答:1

我们已经知道,我们使用以下代码来解析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 (...) {}
...

然后,使用上面带有异常捕获的代码,我可以将对象与数组区分开。

所以,有什么办法可以无一例外地解决这种问题?

json poco
1个回答
0
投票

使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.