示例#1
0
bool Zerobuf::_fromJSON( const std::string& string )
{
    if( !_allocator )
        return true;

    Json::Value json;
    Json::Reader reader;
    if( !reader.parse( string, json ))
    {
        std::cerr << "Error parsing JSON: "
                  << reader.getFormattedErrorMessages() << std::endl;
        return false;
    }

    try
    {
        _parseJSON( json );
    }
    catch( const std::exception& e )
    {
        std::cerr << "Error applying JSON: " << e.what() << std::endl;
        return false;
    }

    compact();
    return true;
}
示例#2
0
//! (static)
Object* JSON::parseJSON(const std::string &s){
	Tokenizer t;

	Tokenizer::tokenList_t tokens;
	t.getTokens(s.c_str(),tokens);
	Tokenizer::tokenList_t::iterator it=tokens.begin();
	Object * result= _parseJSON(it,tokens.end());
	if(it!=tokens.end() && !Token::isA<TEndScript>(*it)){
		std::cout << "JSON Syntax Error\n";
	}
	if(result==NULL){
		result=String::create(s);
	}
//	for(it=tokens.begin();it!=tokens.end();++it){
//		Token::removeReference(*it);
//	}
	return result;
}
示例#3
0
bool Zerobuf::_fromJSON( const std::string& string )
{
    if( !_allocator )
        throw std::runtime_error(
            "Can't convert empty Zerobuf object from JSON" );

    Json::Value json;
    Json::Reader reader;
    if( !reader.parse( string, json ))
    {
        std::cerr << "Error parsing JSON: "
                  << reader.getFormattedErrorMessages() << std::endl;
        return false;
    }

    _parseJSON( json );
    compact();
    return true;
}
JSONValue* parseJSON(std::string str){
    //process the string..
    std::string toParse;
    bool withinQuotes = false;
    for (int i=0,l = str.length(); i<l; i++){
        if (str[i]>32 || withinQuotes)
            toParse += str[i];
        if (str[i] == '\"')
            withinQuotes = !withinQuotes;
    }
    JSONValue* j;
    try{
        j = _parseJSON(toParse,1);
    }catch (const char* x){
        std::cout<<"Exception: "<<x<<std::endl;
        std::cout<<"Exiting."<<std::endl;
        exit(1);
    }
    return j;
}
示例#5
0
//! helper
static Object * _parseJSON(Tokenizer::tokenList_t::iterator & cursor,const Tokenizer::tokenList_t::iterator end){
	if(cursor==end)
		return NULL;
	Token * token=(*cursor).get();
	if(dynamic_cast<TOperator*>(token)&& token->toString()=="_-"){ /// unary minus
		++cursor;
		TObject * tObj = Token::cast<TObject>(*cursor);
		if(tObj==NULL || !dynamic_cast<Number*>(tObj->obj.get())){
			std::cout << "Number expected! \n";
			return NULL;
		}

		++cursor;

		return Number::create(-tObj->obj->toDouble());
//    }else if(dynamic_cast<String*>(token) || dynamic_cast<Number*>(token) || dynamic_cast<Bool*>(token)){
//        ++cursor;
//        return token->clone();
//    }else if(dynamic_cast<Void*>(token)){
//        ++cursor;
//        return Void::get();
	}else if(TObject * tObj=dynamic_cast<TObject *>(token)){
		++cursor;
		return tObj->obj->clone();
	}else if (dynamic_cast<TStartBlock *>(token)){
		Map *m=Map::create();
		++cursor;
		while( true){
			if(cursor==end){
				std::cout << "M1 \n";
				break;
			}else  if( Token::isA<TEndBlock>(*cursor)){
				cursor++;
				break;
			}
			TObject * tObj2=Token::cast<TObject>(*cursor);
			String * key= (tObj2==NULL ? NULL : dynamic_cast<String*>(tObj2->obj.get()));
			if(!key){
				std::cout << "string expected \n";
				break;
			}
			++cursor;
			if(cursor==end){
				std::cout << "M3! \n";
				break;
			}else if(!Token::isA<TColon>(*cursor)){
				std::cout << "':' expected \n";
				break;
			}
			++cursor;
			if(cursor==end){
				std::cout << "M4! \n";
				break;
			}
			Object * o=_parseJSON(cursor,end);
			if(!o){

				std::cout << "M5! \n"<<(*cursor)->toString()<<"\n";
				break;
			}
			m->setValue(key->clone(),o);
//            ++cursor;
			if(cursor==end){
				std::cout << "unexpected ending. \n";
				break;
			}else  if(Token::isA<TEndBlock>(*cursor)){
				cursor++;
				break;
			}else if(Token::isA<TDelimiter>(*cursor)){
				cursor++;
				continue;
			}
			std::cout << "',' or '}' expected \n";
			std::cout <<(*cursor)->toString()<<"\n";
			break;
		}
		return m;
	}else if (Token::isA<TStartIndex>(token)){
		Array *a=Array::create();
		++cursor;
		while( true){
			if(cursor==end){
				std::cout << "A1! \n";
				break;
			}else if(Token::isA<TEndIndex>(*cursor)){
				cursor++;
				break;
			}
			Object * o=_parseJSON(cursor,end);
			if(!o){
				std::cout << "A2! \n";
				break;
			}
			a->pushBack(o);
//            ++cursor;
			if(cursor==end){
				std::cout << "A3! \n";
				break;
			}else  if(Token::isA<TEndIndex>(*cursor)){
				cursor++;
				break;
			}else if(Token::isA<TDelimiter>(*cursor)){
				cursor++;
				continue;
			}
			std::cout << "A4! \n";
			std::cout <<(*cursor)->toString()<<"\n";
			break;
		}
		return a;
	}
	else if(TIdentifier* ti=Token::cast<TIdentifier>(token)){
		std::cout << "Unknown Identifier: "<<ti->toString()<<"\n";
		return NULL;

	}
	return NULL;
}