void JSONTest::testDoubleElement() { std::string json = "[ 123.45 ]"; Parser parser; Var result; try { DefaultHandler handler; parser.setHandler(&handler); parser.parse(json); result = handler.result(); } catch(JSONException& jsone) { std::cout << jsone.message() << std::endl; assert(false); } assert(result.type() == typeid(Array::Ptr)); Array::Ptr array = result.extract<Array::Ptr>(); Var test = array->get(0); assert(test.isNumeric()); double value = test; assert(value == 123.45); }
void JSONTest::testNullElement() { std::string json = "[ null ]"; Parser parser; Var result; try { DefaultHandler handler; parser.setHandler(&handler); parser.parse(json); result = handler.result(); } catch(JSONException& jsone) { std::cout << jsone.message() << std::endl; assert(false); } assert(result.type() == typeid(Array::Ptr)); Array::Ptr array = result.extract<Array::Ptr>(); assert(array->isNull(0)); Var test = array->get(0); assert(test.isEmpty()); }
void JSONTest::testStringElement() { std::string json = "[ \"value\" ]"; Parser parser; Var result; try { DefaultHandler handler; parser.setHandler(&handler); parser.parse(json); result = handler.result(); } catch(JSONException& jsone) { std::cout << jsone.message() << std::endl; assert(false); } assert(result.type() == typeid(Array::Ptr)); Array::Ptr array = result.extract<Array::Ptr>(); Var test = array->get(0); assert(test.isString()); std::string value = test.convert<std::string>(); assert(value.compare("value") == 0); }
Var Query::find(const std::string& path) const { Var result = _source; StringTokenizer tokenizer(path, "."); for(StringTokenizer::Iterator token = tokenizer.begin(); token != tokenizer.end(); token++) { if ( !result.isEmpty() ) { std::vector<int> indexes; RegularExpression::MatchVec matches; int firstOffset = -1; int offset = 0; RegularExpression regex("\\[([0-9]+)\\]"); while(regex.match(*token, offset, matches) > 0 ) { if ( firstOffset == -1 ) { firstOffset = static_cast<int>(matches[0].offset); } std::string num = token->substr(matches[1].offset, matches[1].length); indexes.push_back(NumberParser::parse(num)); offset = static_cast<int>(matches[0].offset + matches[0].length); } std::string name(*token); if ( firstOffset != -1 ) { name = name.substr(0, firstOffset); } if ( name.length() > 0 ) { if ( result.type() == typeid(Object::Ptr) ) { Object::Ptr o = result.extract<Object::Ptr>(); result = o->get(name); } } if ( !result.isEmpty() && !indexes.empty() ) { for(std::vector<int>::iterator it = indexes.begin(); it != indexes.end(); ++it ) { if ( result.type() == typeid(Array::Ptr) ) { Array::Ptr array = result.extract<Array::Ptr>(); result = array->get(*it); if ( result.isEmpty() ) { break; } } } } } } return result; }