1f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Copyright 2007-2010 Baptiste Lepilleur 2f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Distributed under MIT license, or public domain if desired and 3f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// recognized in your jurisdiction. 4f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE 5f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 6f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef CPPTL_JSON_READER_H_INCLUDED 7f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# define CPPTL_JSON_READER_H_INCLUDED 8f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 9f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#if !defined(JSON_IS_AMALGAMATION) 10f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include "features.h" 11f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include "value.h" 12f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // if !defined(JSON_IS_AMALGAMATION) 13f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <deque> 14f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <stack> 15f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# include <string> 16f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 17f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIInamespace Json { 18f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 19f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value. 20f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 21f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 22f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class JSON_API Reader 23f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 24f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 25f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef char Char; 26f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef const Char *Location; 27f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 28f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Constructs a Reader allowing all features 29f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * for parsing. 30f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 31f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Reader(); 32f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 33f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Constructs a Reader allowing the specified feature set 34f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * for parsing. 35f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 36f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Reader( const Features &features ); 37f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 38f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document. 39f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param document UTF-8 encoded string containing the document to read. 40f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param root [out] Contains the root value of the document if it was 41f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * successfully parsed. 42f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param collectComments \c true to collect comment and allow writing them back during 43f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * serialization, \c false to discard comments. 44f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * This parameter is ignored if Features::allowComments_ 45f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * is \c false. 46f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \return \c true if the document was successfully parsed, \c false if an error occurred. 47f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 48f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool parse( const std::string &document, 49f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &root, 50f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool collectComments = true ); 51f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 52f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document. 53f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the document to read. 54f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param endDoc Pointer on the end of the UTF-8 encoded string of the document to read. 55f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \ Must be >= beginDoc. 56f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param root [out] Contains the root value of the document if it was 57f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * successfully parsed. 58f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \param collectComments \c true to collect comment and allow writing them back during 59f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * serialization, \c false to discard comments. 60f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * This parameter is ignored if Features::allowComments_ 61f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * is \c false. 62f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \return \c true if the document was successfully parsed, \c false if an error occurred. 63f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 64f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool parse( const char *beginDoc, const char *endDoc, 65f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &root, 66f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool collectComments = true ); 67f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 68f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \brief Parse from input stream. 69f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// \see Json::operator>>(std::istream&, Json::Value&). 70f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool parse( std::istream &is, 71f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value &root, 72f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool collectComments = true ); 73f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 74f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Returns a user friendly string that list errors in the parsed document. 75f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \return Formatted error message with the list of errors with their location in 76f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * the parsed document. An empty string is returned if no error occurred 77f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * during parsing. 78f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \deprecated Use getFormattedErrorMessages() instead (typo fix). 79f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 80f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III JSONCPP_DEPRECATED("Use getFormattedErrorMessages instead") 81f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string getFormatedErrorMessages() const; 82f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 83f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Returns a user friendly string that list errors in the parsed document. 84f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * \return Formatted error message with the list of errors with their location in 85f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * the parsed document. An empty string is returned if no error occurred 86f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * during parsing. 87f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 88f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string getFormattedErrorMessages() const; 89f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 90f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III private: 91f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III enum TokenType 92f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 93f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenEndOfStream = 0, 94f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenObjectBegin, 95f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenObjectEnd, 96f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenArrayBegin, 97f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenArrayEnd, 98f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenString, 99f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenNumber, 100f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenTrue, 101f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenFalse, 102f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenNull, 103f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenArraySeparator, 104f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenMemberSeparator, 105f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenComment, 106f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III tokenError 107f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 108f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 109f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class Token 110f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 111f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 112f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TokenType type_; 113f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location start_; 114f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location end_; 115f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 116f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 117f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III class ErrorInfo 118f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 119f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III public: 120f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Token token_; 121f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string message_; 122f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location extra_; 123f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 124f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 125f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef std::deque<ErrorInfo> Errors; 126f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 127f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool expectToken( TokenType type, Token &token, const char *message ); 128f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool readToken( Token &token ); 129f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void skipSpaces(); 130f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool match( Location pattern, 131f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int patternLength ); 132f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool readComment(); 133f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool readCStyleComment(); 134f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool readCppStyleComment(); 135f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool readString(); 136f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void readNumber(); 137f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool readValue(); 138f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool readObject( Token &token ); 139f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool readArray( Token &token ); 140f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool decodeNumber( Token &token ); 141f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool decodeString( Token &token ); 142f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool decodeString( Token &token, std::string &decoded ); 143f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool decodeDouble( Token &token ); 144f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool decodeUnicodeCodePoint( Token &token, 145f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location ¤t, 146f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location end, 147f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III unsigned int &unicode ); 148f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool decodeUnicodeEscapeSequence( Token &token, 149f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location ¤t, 150f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location end, 151f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III unsigned int &unicode ); 152f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool addError( const std::string &message, 153f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Token &token, 154f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location extra = 0 ); 155f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool recoverFromError( TokenType skipUntilToken ); 156f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool addErrorAndRecover( const std::string &message, 157f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Token &token, 158f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III TokenType skipUntilToken ); 159f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void skipUntilSpace(); 160f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value ¤tValue(); 161f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Char getNextChar(); 162f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void getLocationLineAndColumn( Location location, 163f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int &line, 164f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III int &column ) const; 165f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string getLocationLineAndColumn( Location location ) const; 166f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void addComment( Location begin, 167f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location end, 168f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III CommentPlacement placement ); 169f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III void skipCommentTokens( Token &token ); 170f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 171f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III typedef std::stack<Value *> Nodes; 172f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Nodes nodes_; 173f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Errors errors_; 174f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string document_; 175f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location begin_; 176f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location end_; 177f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location current_; 178f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Location lastValueEnd_; 179f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Value *lastValue_; 180f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string commentsBefore_; 181f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Features features_; 182f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III bool collectComments_; 183f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III }; 184f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 185f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /** \brief Read from 'sin' into 'root'. 186f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 187f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Always keep comments from the input JSON. 188f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 189f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III This can be used to read a file into a particular sub-object. 190f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III For example: 191f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \code 192f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Json::Value root; 193f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III cin >> root["dir"]["file"]; 194f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III cout << root; 195f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \endcode 196f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III Result: 197f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \verbatim 198f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 199f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III "dir": { 200f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III "file": { 201f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // The input stream JSON would be nested here. 202f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 203f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 204f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 205f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \endverbatim 206f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \throw std::exception on parse error. 207f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III \see Json::operator<<() 208f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 209f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::istream& operator>>( std::istream&, Value& ); 210f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 211f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III} // namespace Json 212f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 213f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // CPPTL_JSON_READER_H_INCLUDED 214