-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Closed
Description
Hi,
When using JSONConfiguration in combination with ConfigurationView there is an issue with array access
For example, the following code does not work as expected:
std::string json = R"json( { "foo" : [ "bar" ] } )json";
std::shared_ptr< Poco::Util::JSONConfiguration > pConfig = std::make_shared< Poco::Util::JSONConfiguration >();
std::istringstream stream(json);
pConfig->load(stream);
Poco::Util::AbstractConfiguration::Ptr pView = pConfig->createView( "foo" );
//now grab item 0 which should be "bar"
std::string shouldBeBar = pView->getString("[0]");
//now grab item 1 which is not valid and should throw an exception
std::string shouldThrow= pView->getString("[1]");
// ERROR!! <--- No exception is thrown
In the code above, shouldThrow is set to the string { "foo" : [ "bar" ] } which is incorrect.
The error can be tracked to this code in the ConfigurationView, the first term evaluates to false (not found) then the second term is evaluated and returns true, also setting value to { "foo" : [ "bar" ] } clearly this is not expected behaviour.
bool ConfigurationView::getRaw(const std::string& key, std::string& value) const
{
std::string translatedKey = translateKey(key);
return _pConfig->getRaw(translatedKey, value) || _pConfig->getRaw(key, value);
}
At the moment I am able to hack in a fix by removing the second term with no ill effects. However this may impact other configuration types. Needs some serious investigation...
bool ConfigurationView::getRaw(const std::string& key, std::string& value) const
{
std::string translatedKey = translateKey(key);
return _pConfig->getRaw(translatedKey, value);
}
Cheers
Tom
Reactions are currently unavailable