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 &current,
146f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                                   Location end,
147f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                                   unsigned int &unicode );
148f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III      bool decodeUnicodeEscapeSequence( Token &token,
149f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III                                        Location &current,
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 &currentValue();
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