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; }
//! (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; }
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; }
//! 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; }