#ifndef BU_JSON_H #define BU_JSON_H #include "bu/hash.h" #include "bu/list.h" #include "bu/string.h" #include "bu/utfstring.h" namespace Bu { class Stream; class Json { private: Json( char &c, Bu::Stream &sInput ); typedef Bu::Hash JsonHash; typedef Bu::List JsonList; public: typedef JsonList::iterator iterator; typedef JsonList::const_iterator const_iterator; enum Type { Invalid, Object, Array, String, Number, Boolean, Null }; public: Json(); Json( const Bu::UtfString &sValue ); Json( const Bu::String &sValue ); Json( const char *sValue ); Json( double dValue ); Json( bool bValue ); Json( Type eType ); Json( Bu::Stream &sInput ); virtual ~Json(); Type getType() const; Bu::String getString() const; double getNumber() const; bool getBoolean() const; bool isNull() const; Json *operator[]( const Bu::String &sKey ) const; int getSize() const; iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; bool has( const Bu::String &sKey ) const; void insert( const Bu::String &sKey, Bu::Json *pObj ); void append( Bu::Json *pObj ); void parse( Bu::Stream &sInput ); void parse( const Bu::String &sInput ); void reset(); void write( Bu::Stream &sOutput ) const; void writeStable( Bu::Stream &sOutput ) const; Bu::String toString() const; Bu::String toStringStable() const; private: void parse( char &c, Bu::Stream &sInput ); void parseString( char &c, Bu::Stream &sInput, Bu::String &sOut ); void parseString( char &c, Bu::Stream &sInput ); void parseObject( char &c, Bu::Stream &sInput ); void parseArray( char &c, Bu::Stream &sInput ); void parseNumber( char &c, Bu::Stream &sInput ); void parseLiteral( char &c, Bu::Stream &sInput ); bool readChar( char &c, Bu::Stream &sInput ); void readChar( char &c, Bu::Stream &sInput, const char *sSection ); bool isWs( char c ); void skipWs( char &c, Bu::Stream &sInput ); void writeStr( const Bu::String &sStr, Bu::Stream &sOutput ) const; private: Type eType; union DatUnion { DatUnion() : pObject( NULL ) { } DatUnion( const Bu::String &sValue ) : pString( new Bu::String( sValue ) ) { } DatUnion( const char *sValue ) : pString( new Bu::String( sValue ) ) { } DatUnion( double dValue ) : dNumber( dValue ) { } DatUnion( bool bValue ) : bBoolean( bValue ) { } JsonHash *pObject; JsonList *pArray; Bu::String *pString; double dNumber; bool bBoolean; } uDat; }; }; #endif