xref: /aosp_15_r20/external/jsoncpp/include/json/reader.h (revision 4484440890e2bc6e07362b4feaf15601abfe0071)
1*44844408SAndroid Build Coastguard Worker // Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
2*44844408SAndroid Build Coastguard Worker // Distributed under MIT license, or public domain if desired and
3*44844408SAndroid Build Coastguard Worker // recognized in your jurisdiction.
4*44844408SAndroid Build Coastguard Worker // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
5*44844408SAndroid Build Coastguard Worker 
6*44844408SAndroid Build Coastguard Worker #ifndef JSON_READER_H_INCLUDED
7*44844408SAndroid Build Coastguard Worker #define JSON_READER_H_INCLUDED
8*44844408SAndroid Build Coastguard Worker 
9*44844408SAndroid Build Coastguard Worker #if !defined(JSON_IS_AMALGAMATION)
10*44844408SAndroid Build Coastguard Worker #include "json_features.h"
11*44844408SAndroid Build Coastguard Worker #include "value.h"
12*44844408SAndroid Build Coastguard Worker #endif // if !defined(JSON_IS_AMALGAMATION)
13*44844408SAndroid Build Coastguard Worker #include <deque>
14*44844408SAndroid Build Coastguard Worker #include <iosfwd>
15*44844408SAndroid Build Coastguard Worker #include <istream>
16*44844408SAndroid Build Coastguard Worker #include <stack>
17*44844408SAndroid Build Coastguard Worker #include <string>
18*44844408SAndroid Build Coastguard Worker 
19*44844408SAndroid Build Coastguard Worker // Disable warning C4251: <data member>: <type> needs to have dll-interface to
20*44844408SAndroid Build Coastguard Worker // be used by...
21*44844408SAndroid Build Coastguard Worker #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
22*44844408SAndroid Build Coastguard Worker #pragma warning(push)
23*44844408SAndroid Build Coastguard Worker #pragma warning(disable : 4251)
24*44844408SAndroid Build Coastguard Worker #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
25*44844408SAndroid Build Coastguard Worker 
26*44844408SAndroid Build Coastguard Worker #pragma pack(push, 8)
27*44844408SAndroid Build Coastguard Worker 
28*44844408SAndroid Build Coastguard Worker namespace Json {
29*44844408SAndroid Build Coastguard Worker 
30*44844408SAndroid Build Coastguard Worker /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a
31*44844408SAndroid Build Coastguard Worker  * Value.
32*44844408SAndroid Build Coastguard Worker  *
33*44844408SAndroid Build Coastguard Worker  * \deprecated Use CharReader and CharReaderBuilder.
34*44844408SAndroid Build Coastguard Worker  */
35*44844408SAndroid Build Coastguard Worker 
36*44844408SAndroid Build Coastguard Worker class JSON_API Reader {
37*44844408SAndroid Build Coastguard Worker public:
38*44844408SAndroid Build Coastguard Worker   using Char = char;
39*44844408SAndroid Build Coastguard Worker   using Location = const Char*;
40*44844408SAndroid Build Coastguard Worker 
41*44844408SAndroid Build Coastguard Worker   /** \brief An error tagged with where in the JSON text it was encountered.
42*44844408SAndroid Build Coastguard Worker    *
43*44844408SAndroid Build Coastguard Worker    * The offsets give the [start, limit) range of bytes within the text. Note
44*44844408SAndroid Build Coastguard Worker    * that this is bytes, not codepoints.
45*44844408SAndroid Build Coastguard Worker    */
46*44844408SAndroid Build Coastguard Worker   struct StructuredError {
47*44844408SAndroid Build Coastguard Worker     ptrdiff_t offset_start;
48*44844408SAndroid Build Coastguard Worker     ptrdiff_t offset_limit;
49*44844408SAndroid Build Coastguard Worker     String message;
50*44844408SAndroid Build Coastguard Worker   };
51*44844408SAndroid Build Coastguard Worker 
52*44844408SAndroid Build Coastguard Worker   /** \brief Constructs a Reader allowing all features for parsing.
53*44844408SAndroid Build Coastguard Worker     * \deprecated Use CharReader and CharReaderBuilder.
54*44844408SAndroid Build Coastguard Worker    */
55*44844408SAndroid Build Coastguard Worker   Reader();
56*44844408SAndroid Build Coastguard Worker 
57*44844408SAndroid Build Coastguard Worker   /** \brief Constructs a Reader allowing the specified feature set for parsing.
58*44844408SAndroid Build Coastguard Worker     * \deprecated Use CharReader and CharReaderBuilder.
59*44844408SAndroid Build Coastguard Worker    */
60*44844408SAndroid Build Coastguard Worker   Reader(const Features& features);
61*44844408SAndroid Build Coastguard Worker 
62*44844408SAndroid Build Coastguard Worker   /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
63*44844408SAndroid Build Coastguard Worker    * document.
64*44844408SAndroid Build Coastguard Worker    *
65*44844408SAndroid Build Coastguard Worker    * \param      document        UTF-8 encoded string containing the document
66*44844408SAndroid Build Coastguard Worker    *                             to read.
67*44844408SAndroid Build Coastguard Worker    * \param[out] root            Contains the root value of the document if it
68*44844408SAndroid Build Coastguard Worker    *                             was successfully parsed.
69*44844408SAndroid Build Coastguard Worker    * \param      collectComments \c true to collect comment and allow writing
70*44844408SAndroid Build Coastguard Worker    *                             them back during serialization, \c false to
71*44844408SAndroid Build Coastguard Worker    *                             discard comments.  This parameter is ignored
72*44844408SAndroid Build Coastguard Worker    *                             if Features::allowComments_ is \c false.
73*44844408SAndroid Build Coastguard Worker    * \return \c true if the document was successfully parsed, \c false if an
74*44844408SAndroid Build Coastguard Worker    * error occurred.
75*44844408SAndroid Build Coastguard Worker    */
76*44844408SAndroid Build Coastguard Worker   bool parse(const std::string& document, Value& root,
77*44844408SAndroid Build Coastguard Worker              bool collectComments = true);
78*44844408SAndroid Build Coastguard Worker 
79*44844408SAndroid Build Coastguard Worker   /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
80*44844408SAndroid Build Coastguard Worker    * document.
81*44844408SAndroid Build Coastguard Worker    *
82*44844408SAndroid Build Coastguard Worker    * \param      beginDoc        Pointer on the beginning of the UTF-8 encoded
83*44844408SAndroid Build Coastguard Worker    *                             string of the document to read.
84*44844408SAndroid Build Coastguard Worker    * \param      endDoc          Pointer on the end of the UTF-8 encoded string
85*44844408SAndroid Build Coastguard Worker    *                             of the document to read.  Must be >= beginDoc.
86*44844408SAndroid Build Coastguard Worker    * \param[out] root            Contains the root value of the document if it
87*44844408SAndroid Build Coastguard Worker    *                             was successfully parsed.
88*44844408SAndroid Build Coastguard Worker    * \param      collectComments \c true to collect comment and allow writing
89*44844408SAndroid Build Coastguard Worker    *                             them back during serialization, \c false to
90*44844408SAndroid Build Coastguard Worker    *                             discard comments.  This parameter is ignored
91*44844408SAndroid Build Coastguard Worker    *                             if Features::allowComments_ is \c false.
92*44844408SAndroid Build Coastguard Worker    * \return \c true if the document was successfully parsed, \c false if an
93*44844408SAndroid Build Coastguard Worker    * error occurred.
94*44844408SAndroid Build Coastguard Worker    */
95*44844408SAndroid Build Coastguard Worker   bool parse(const char* beginDoc, const char* endDoc, Value& root,
96*44844408SAndroid Build Coastguard Worker              bool collectComments = true);
97*44844408SAndroid Build Coastguard Worker 
98*44844408SAndroid Build Coastguard Worker   /// \brief Parse from input stream.
99*44844408SAndroid Build Coastguard Worker   /// \see Json::operator>>(std::istream&, Json::Value&).
100*44844408SAndroid Build Coastguard Worker   bool parse(IStream& is, Value& root, bool collectComments = true);
101*44844408SAndroid Build Coastguard Worker 
102*44844408SAndroid Build Coastguard Worker   /** \brief Returns a user friendly string that list errors in the parsed
103*44844408SAndroid Build Coastguard Worker    * document.
104*44844408SAndroid Build Coastguard Worker    *
105*44844408SAndroid Build Coastguard Worker    * \return Formatted error message with the list of errors with their
106*44844408SAndroid Build Coastguard Worker    * location in the parsed document. An empty string is returned if no error
107*44844408SAndroid Build Coastguard Worker    * occurred during parsing.
108*44844408SAndroid Build Coastguard Worker    * \deprecated Use getFormattedErrorMessages() instead (typo fix).
109*44844408SAndroid Build Coastguard Worker    */
110*44844408SAndroid Build Coastguard Worker   JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.")
111*44844408SAndroid Build Coastguard Worker   String getFormatedErrorMessages() const;
112*44844408SAndroid Build Coastguard Worker 
113*44844408SAndroid Build Coastguard Worker   /** \brief Returns a user friendly string that list errors in the parsed
114*44844408SAndroid Build Coastguard Worker    * document.
115*44844408SAndroid Build Coastguard Worker    *
116*44844408SAndroid Build Coastguard Worker    * \return Formatted error message with the list of errors with their
117*44844408SAndroid Build Coastguard Worker    * location in the parsed document. An empty string is returned if no error
118*44844408SAndroid Build Coastguard Worker    * occurred during parsing.
119*44844408SAndroid Build Coastguard Worker    */
120*44844408SAndroid Build Coastguard Worker   String getFormattedErrorMessages() const;
121*44844408SAndroid Build Coastguard Worker 
122*44844408SAndroid Build Coastguard Worker   /** \brief Returns a vector of structured errors encountered while parsing.
123*44844408SAndroid Build Coastguard Worker    *
124*44844408SAndroid Build Coastguard Worker    * \return A (possibly empty) vector of StructuredError objects. Currently
125*44844408SAndroid Build Coastguard Worker    * only one error can be returned, but the caller should tolerate multiple
126*44844408SAndroid Build Coastguard Worker    * errors.  This can occur if the parser recovers from a non-fatal parse
127*44844408SAndroid Build Coastguard Worker    * error and then encounters additional errors.
128*44844408SAndroid Build Coastguard Worker    */
129*44844408SAndroid Build Coastguard Worker   std::vector<StructuredError> getStructuredErrors() const;
130*44844408SAndroid Build Coastguard Worker 
131*44844408SAndroid Build Coastguard Worker   /** \brief Add a semantic error message.
132*44844408SAndroid Build Coastguard Worker    *
133*44844408SAndroid Build Coastguard Worker    * \param value   JSON Value location associated with the error
134*44844408SAndroid Build Coastguard Worker    * \param message The error message.
135*44844408SAndroid Build Coastguard Worker    * \return \c true if the error was successfully added, \c false if the Value
136*44844408SAndroid Build Coastguard Worker    * offset exceeds the document size.
137*44844408SAndroid Build Coastguard Worker    */
138*44844408SAndroid Build Coastguard Worker   bool pushError(const Value& value, const String& message);
139*44844408SAndroid Build Coastguard Worker 
140*44844408SAndroid Build Coastguard Worker   /** \brief Add a semantic error message with extra context.
141*44844408SAndroid Build Coastguard Worker    *
142*44844408SAndroid Build Coastguard Worker    * \param value   JSON Value location associated with the error
143*44844408SAndroid Build Coastguard Worker    * \param message The error message.
144*44844408SAndroid Build Coastguard Worker    * \param extra   Additional JSON Value location to contextualize the error
145*44844408SAndroid Build Coastguard Worker    * \return \c true if the error was successfully added, \c false if either
146*44844408SAndroid Build Coastguard Worker    * Value offset exceeds the document size.
147*44844408SAndroid Build Coastguard Worker    */
148*44844408SAndroid Build Coastguard Worker   bool pushError(const Value& value, const String& message, const Value& extra);
149*44844408SAndroid Build Coastguard Worker 
150*44844408SAndroid Build Coastguard Worker   /** \brief Return whether there are any errors.
151*44844408SAndroid Build Coastguard Worker    *
152*44844408SAndroid Build Coastguard Worker    * \return \c true if there are no errors to report \c false if errors have
153*44844408SAndroid Build Coastguard Worker    * occurred.
154*44844408SAndroid Build Coastguard Worker    */
155*44844408SAndroid Build Coastguard Worker   bool good() const;
156*44844408SAndroid Build Coastguard Worker 
157*44844408SAndroid Build Coastguard Worker private:
158*44844408SAndroid Build Coastguard Worker   enum TokenType {
159*44844408SAndroid Build Coastguard Worker     tokenEndOfStream = 0,
160*44844408SAndroid Build Coastguard Worker     tokenObjectBegin,
161*44844408SAndroid Build Coastguard Worker     tokenObjectEnd,
162*44844408SAndroid Build Coastguard Worker     tokenArrayBegin,
163*44844408SAndroid Build Coastguard Worker     tokenArrayEnd,
164*44844408SAndroid Build Coastguard Worker     tokenString,
165*44844408SAndroid Build Coastguard Worker     tokenNumber,
166*44844408SAndroid Build Coastguard Worker     tokenTrue,
167*44844408SAndroid Build Coastguard Worker     tokenFalse,
168*44844408SAndroid Build Coastguard Worker     tokenNull,
169*44844408SAndroid Build Coastguard Worker     tokenArraySeparator,
170*44844408SAndroid Build Coastguard Worker     tokenMemberSeparator,
171*44844408SAndroid Build Coastguard Worker     tokenComment,
172*44844408SAndroid Build Coastguard Worker     tokenError
173*44844408SAndroid Build Coastguard Worker   };
174*44844408SAndroid Build Coastguard Worker 
175*44844408SAndroid Build Coastguard Worker   class Token {
176*44844408SAndroid Build Coastguard Worker   public:
177*44844408SAndroid Build Coastguard Worker     TokenType type_;
178*44844408SAndroid Build Coastguard Worker     Location start_;
179*44844408SAndroid Build Coastguard Worker     Location end_;
180*44844408SAndroid Build Coastguard Worker   };
181*44844408SAndroid Build Coastguard Worker 
182*44844408SAndroid Build Coastguard Worker   class ErrorInfo {
183*44844408SAndroid Build Coastguard Worker   public:
184*44844408SAndroid Build Coastguard Worker     Token token_;
185*44844408SAndroid Build Coastguard Worker     String message_;
186*44844408SAndroid Build Coastguard Worker     Location extra_;
187*44844408SAndroid Build Coastguard Worker   };
188*44844408SAndroid Build Coastguard Worker 
189*44844408SAndroid Build Coastguard Worker   using Errors = std::deque<ErrorInfo>;
190*44844408SAndroid Build Coastguard Worker 
191*44844408SAndroid Build Coastguard Worker   bool readToken(Token& token);
192*44844408SAndroid Build Coastguard Worker   void skipSpaces();
193*44844408SAndroid Build Coastguard Worker   bool match(const Char* pattern, int patternLength);
194*44844408SAndroid Build Coastguard Worker   bool readComment();
195*44844408SAndroid Build Coastguard Worker   bool readCStyleComment();
196*44844408SAndroid Build Coastguard Worker   bool readCppStyleComment();
197*44844408SAndroid Build Coastguard Worker   bool readString();
198*44844408SAndroid Build Coastguard Worker   void readNumber();
199*44844408SAndroid Build Coastguard Worker   bool readValue();
200*44844408SAndroid Build Coastguard Worker   bool readObject(Token& token);
201*44844408SAndroid Build Coastguard Worker   bool readArray(Token& token);
202*44844408SAndroid Build Coastguard Worker   bool decodeNumber(Token& token);
203*44844408SAndroid Build Coastguard Worker   bool decodeNumber(Token& token, Value& decoded);
204*44844408SAndroid Build Coastguard Worker   bool decodeString(Token& token);
205*44844408SAndroid Build Coastguard Worker   bool decodeString(Token& token, String& decoded);
206*44844408SAndroid Build Coastguard Worker   bool decodeDouble(Token& token);
207*44844408SAndroid Build Coastguard Worker   bool decodeDouble(Token& token, Value& decoded);
208*44844408SAndroid Build Coastguard Worker   bool decodeUnicodeCodePoint(Token& token, Location& current, Location end,
209*44844408SAndroid Build Coastguard Worker                               unsigned int& unicode);
210*44844408SAndroid Build Coastguard Worker   bool decodeUnicodeEscapeSequence(Token& token, Location& current,
211*44844408SAndroid Build Coastguard Worker                                    Location end, unsigned int& unicode);
212*44844408SAndroid Build Coastguard Worker   bool addError(const String& message, Token& token, Location extra = nullptr);
213*44844408SAndroid Build Coastguard Worker   bool recoverFromError(TokenType skipUntilToken);
214*44844408SAndroid Build Coastguard Worker   bool addErrorAndRecover(const String& message, Token& token,
215*44844408SAndroid Build Coastguard Worker                           TokenType skipUntilToken);
216*44844408SAndroid Build Coastguard Worker   void skipUntilSpace();
217*44844408SAndroid Build Coastguard Worker   Value& currentValue();
218*44844408SAndroid Build Coastguard Worker   Char getNextChar();
219*44844408SAndroid Build Coastguard Worker   void getLocationLineAndColumn(Location location, int& line,
220*44844408SAndroid Build Coastguard Worker                                 int& column) const;
221*44844408SAndroid Build Coastguard Worker   String getLocationLineAndColumn(Location location) const;
222*44844408SAndroid Build Coastguard Worker   void addComment(Location begin, Location end, CommentPlacement placement);
223*44844408SAndroid Build Coastguard Worker   void skipCommentTokens(Token& token);
224*44844408SAndroid Build Coastguard Worker 
225*44844408SAndroid Build Coastguard Worker   static bool containsNewLine(Location begin, Location end);
226*44844408SAndroid Build Coastguard Worker   static String normalizeEOL(Location begin, Location end);
227*44844408SAndroid Build Coastguard Worker 
228*44844408SAndroid Build Coastguard Worker   using Nodes = std::stack<Value*>;
229*44844408SAndroid Build Coastguard Worker   Nodes nodes_;
230*44844408SAndroid Build Coastguard Worker   Errors errors_;
231*44844408SAndroid Build Coastguard Worker   String document_;
232*44844408SAndroid Build Coastguard Worker   Location begin_{};
233*44844408SAndroid Build Coastguard Worker   Location end_{};
234*44844408SAndroid Build Coastguard Worker   Location current_{};
235*44844408SAndroid Build Coastguard Worker   Location lastValueEnd_{};
236*44844408SAndroid Build Coastguard Worker   Value* lastValue_{};
237*44844408SAndroid Build Coastguard Worker   String commentsBefore_;
238*44844408SAndroid Build Coastguard Worker   Features features_;
239*44844408SAndroid Build Coastguard Worker   bool collectComments_{};
240*44844408SAndroid Build Coastguard Worker }; // Reader
241*44844408SAndroid Build Coastguard Worker 
242*44844408SAndroid Build Coastguard Worker /** Interface for reading JSON from a char array.
243*44844408SAndroid Build Coastguard Worker  */
244*44844408SAndroid Build Coastguard Worker class JSON_API CharReader {
245*44844408SAndroid Build Coastguard Worker public:
246*44844408SAndroid Build Coastguard Worker   virtual ~CharReader() = default;
247*44844408SAndroid Build Coastguard Worker   /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
248*44844408SAndroid Build Coastguard Worker    * document. The document must be a UTF-8 encoded string containing the
249*44844408SAndroid Build Coastguard Worker    * document to read.
250*44844408SAndroid Build Coastguard Worker    *
251*44844408SAndroid Build Coastguard Worker    * \param      beginDoc Pointer on the beginning of the UTF-8 encoded string
252*44844408SAndroid Build Coastguard Worker    *                      of the document to read.
253*44844408SAndroid Build Coastguard Worker    * \param      endDoc   Pointer on the end of the UTF-8 encoded string of the
254*44844408SAndroid Build Coastguard Worker    *                      document to read. Must be >= beginDoc.
255*44844408SAndroid Build Coastguard Worker    * \param[out] root     Contains the root value of the document if it was
256*44844408SAndroid Build Coastguard Worker    *                      successfully parsed.
257*44844408SAndroid Build Coastguard Worker    * \param[out] errs     Formatted error messages (if not NULL) a user
258*44844408SAndroid Build Coastguard Worker    *                      friendly string that lists errors in the parsed
259*44844408SAndroid Build Coastguard Worker    *                      document.
260*44844408SAndroid Build Coastguard Worker    * \return \c true if the document was successfully parsed, \c false if an
261*44844408SAndroid Build Coastguard Worker    * error occurred.
262*44844408SAndroid Build Coastguard Worker    */
263*44844408SAndroid Build Coastguard Worker   virtual bool parse(char const* beginDoc, char const* endDoc, Value* root,
264*44844408SAndroid Build Coastguard Worker                      String* errs) = 0;
265*44844408SAndroid Build Coastguard Worker 
266*44844408SAndroid Build Coastguard Worker   class JSON_API Factory {
267*44844408SAndroid Build Coastguard Worker   public:
268*44844408SAndroid Build Coastguard Worker     virtual ~Factory() = default;
269*44844408SAndroid Build Coastguard Worker     /** \brief Allocate a CharReader via operator new().
270*44844408SAndroid Build Coastguard Worker      * \throw std::exception if something goes wrong (e.g. invalid settings)
271*44844408SAndroid Build Coastguard Worker      */
272*44844408SAndroid Build Coastguard Worker     virtual CharReader* newCharReader() const = 0;
273*44844408SAndroid Build Coastguard Worker   }; // Factory
274*44844408SAndroid Build Coastguard Worker };   // CharReader
275*44844408SAndroid Build Coastguard Worker 
276*44844408SAndroid Build Coastguard Worker /** \brief Build a CharReader implementation.
277*44844408SAndroid Build Coastguard Worker  *
278*44844408SAndroid Build Coastguard Worker  * Usage:
279*44844408SAndroid Build Coastguard Worker  *   \code
280*44844408SAndroid Build Coastguard Worker  *   using namespace Json;
281*44844408SAndroid Build Coastguard Worker  *   CharReaderBuilder builder;
282*44844408SAndroid Build Coastguard Worker  *   builder["collectComments"] = false;
283*44844408SAndroid Build Coastguard Worker  *   Value value;
284*44844408SAndroid Build Coastguard Worker  *   String errs;
285*44844408SAndroid Build Coastguard Worker  *   bool ok = parseFromStream(builder, std::cin, &value, &errs);
286*44844408SAndroid Build Coastguard Worker  *   \endcode
287*44844408SAndroid Build Coastguard Worker  */
288*44844408SAndroid Build Coastguard Worker class JSON_API CharReaderBuilder : public CharReader::Factory {
289*44844408SAndroid Build Coastguard Worker public:
290*44844408SAndroid Build Coastguard Worker   // Note: We use a Json::Value so that we can add data-members to this class
291*44844408SAndroid Build Coastguard Worker   // without a major version bump.
292*44844408SAndroid Build Coastguard Worker   /** Configuration of this builder.
293*44844408SAndroid Build Coastguard Worker    * These are case-sensitive.
294*44844408SAndroid Build Coastguard Worker    * Available settings (case-sensitive):
295*44844408SAndroid Build Coastguard Worker    * - `"collectComments": false or true`
296*44844408SAndroid Build Coastguard Worker    *   - true to collect comment and allow writing them back during
297*44844408SAndroid Build Coastguard Worker    *     serialization, false to discard comments.  This parameter is ignored
298*44844408SAndroid Build Coastguard Worker    *     if allowComments is false.
299*44844408SAndroid Build Coastguard Worker    * - `"allowComments": false or true`
300*44844408SAndroid Build Coastguard Worker    *   - true if comments are allowed.
301*44844408SAndroid Build Coastguard Worker    * - `"allowTrailingCommas": false or true`
302*44844408SAndroid Build Coastguard Worker    *   - true if trailing commas in objects and arrays are allowed.
303*44844408SAndroid Build Coastguard Worker    * - `"strictRoot": false or true`
304*44844408SAndroid Build Coastguard Worker    *   - true if root must be either an array or an object value
305*44844408SAndroid Build Coastguard Worker    * - `"allowDroppedNullPlaceholders": false or true`
306*44844408SAndroid Build Coastguard Worker    *   - true if dropped null placeholders are allowed. (See
307*44844408SAndroid Build Coastguard Worker    *     StreamWriterBuilder.)
308*44844408SAndroid Build Coastguard Worker    * - `"allowNumericKeys": false or true`
309*44844408SAndroid Build Coastguard Worker    *   - true if numeric object keys are allowed.
310*44844408SAndroid Build Coastguard Worker    * - `"allowSingleQuotes": false or true`
311*44844408SAndroid Build Coastguard Worker    *   - true if '' are allowed for strings (both keys and values)
312*44844408SAndroid Build Coastguard Worker    * - `"stackLimit": integer`
313*44844408SAndroid Build Coastguard Worker    *   - Exceeding stackLimit (recursive depth of `readValue()`) will cause an
314*44844408SAndroid Build Coastguard Worker    *     exception.
315*44844408SAndroid Build Coastguard Worker    *   - This is a security issue (seg-faults caused by deeply nested JSON), so
316*44844408SAndroid Build Coastguard Worker    *     the default is low.
317*44844408SAndroid Build Coastguard Worker    * - `"failIfExtra": false or true`
318*44844408SAndroid Build Coastguard Worker    *   - If true, `parse()` returns false when extra non-whitespace trails the
319*44844408SAndroid Build Coastguard Worker    *     JSON value in the input string.
320*44844408SAndroid Build Coastguard Worker    * - `"rejectDupKeys": false or true`
321*44844408SAndroid Build Coastguard Worker    *   - If true, `parse()` returns false when a key is duplicated within an
322*44844408SAndroid Build Coastguard Worker    *     object.
323*44844408SAndroid Build Coastguard Worker    * - `"allowSpecialFloats": false or true`
324*44844408SAndroid Build Coastguard Worker    *   - If true, special float values (NaNs and infinities) are allowed and
325*44844408SAndroid Build Coastguard Worker    *     their values are lossfree restorable.
326*44844408SAndroid Build Coastguard Worker    * - `"skipBom": false or true`
327*44844408SAndroid Build Coastguard Worker    *   - If true, if the input starts with the Unicode byte order mark (BOM),
328*44844408SAndroid Build Coastguard Worker    *     it is skipped.
329*44844408SAndroid Build Coastguard Worker    *
330*44844408SAndroid Build Coastguard Worker    * You can examine 'settings_` yourself to see the defaults. You can also
331*44844408SAndroid Build Coastguard Worker    * write and read them just like any JSON Value.
332*44844408SAndroid Build Coastguard Worker    * \sa setDefaults()
333*44844408SAndroid Build Coastguard Worker    */
334*44844408SAndroid Build Coastguard Worker   Json::Value settings_;
335*44844408SAndroid Build Coastguard Worker 
336*44844408SAndroid Build Coastguard Worker   CharReaderBuilder();
337*44844408SAndroid Build Coastguard Worker   ~CharReaderBuilder() override;
338*44844408SAndroid Build Coastguard Worker 
339*44844408SAndroid Build Coastguard Worker   CharReader* newCharReader() const override;
340*44844408SAndroid Build Coastguard Worker 
341*44844408SAndroid Build Coastguard Worker   /** \return true if 'settings' are legal and consistent;
342*44844408SAndroid Build Coastguard Worker    *   otherwise, indicate bad settings via 'invalid'.
343*44844408SAndroid Build Coastguard Worker    */
344*44844408SAndroid Build Coastguard Worker   bool validate(Json::Value* invalid) const;
345*44844408SAndroid Build Coastguard Worker 
346*44844408SAndroid Build Coastguard Worker   /** A simple way to update a specific setting.
347*44844408SAndroid Build Coastguard Worker    */
348*44844408SAndroid Build Coastguard Worker   Value& operator[](const String& key);
349*44844408SAndroid Build Coastguard Worker 
350*44844408SAndroid Build Coastguard Worker   /** Called by ctor, but you can use this to reset settings_.
351*44844408SAndroid Build Coastguard Worker    * \pre 'settings' != NULL (but Json::null is fine)
352*44844408SAndroid Build Coastguard Worker    * \remark Defaults:
353*44844408SAndroid Build Coastguard Worker    * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults
354*44844408SAndroid Build Coastguard Worker    */
355*44844408SAndroid Build Coastguard Worker   static void setDefaults(Json::Value* settings);
356*44844408SAndroid Build Coastguard Worker   /** Same as old Features::strictMode().
357*44844408SAndroid Build Coastguard Worker    * \pre 'settings' != NULL (but Json::null is fine)
358*44844408SAndroid Build Coastguard Worker    * \remark Defaults:
359*44844408SAndroid Build Coastguard Worker    * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode
360*44844408SAndroid Build Coastguard Worker    */
361*44844408SAndroid Build Coastguard Worker   static void strictMode(Json::Value* settings);
362*44844408SAndroid Build Coastguard Worker };
363*44844408SAndroid Build Coastguard Worker 
364*44844408SAndroid Build Coastguard Worker /** Consume entire stream and use its begin/end.
365*44844408SAndroid Build Coastguard Worker  * Someday we might have a real StreamReader, but for now this
366*44844408SAndroid Build Coastguard Worker  * is convenient.
367*44844408SAndroid Build Coastguard Worker  */
368*44844408SAndroid Build Coastguard Worker bool JSON_API parseFromStream(CharReader::Factory const&, IStream&, Value* root,
369*44844408SAndroid Build Coastguard Worker                               String* errs);
370*44844408SAndroid Build Coastguard Worker 
371*44844408SAndroid Build Coastguard Worker /** \brief Read from 'sin' into 'root'.
372*44844408SAndroid Build Coastguard Worker  *
373*44844408SAndroid Build Coastguard Worker  * Always keep comments from the input JSON.
374*44844408SAndroid Build Coastguard Worker  *
375*44844408SAndroid Build Coastguard Worker  * This can be used to read a file into a particular sub-object.
376*44844408SAndroid Build Coastguard Worker  * For example:
377*44844408SAndroid Build Coastguard Worker  *   \code
378*44844408SAndroid Build Coastguard Worker  *   Json::Value root;
379*44844408SAndroid Build Coastguard Worker  *   cin >> root["dir"]["file"];
380*44844408SAndroid Build Coastguard Worker  *   cout << root;
381*44844408SAndroid Build Coastguard Worker  *   \endcode
382*44844408SAndroid Build Coastguard Worker  * Result:
383*44844408SAndroid Build Coastguard Worker  * \verbatim
384*44844408SAndroid Build Coastguard Worker  * {
385*44844408SAndroid Build Coastguard Worker  * "dir": {
386*44844408SAndroid Build Coastguard Worker  *    "file": {
387*44844408SAndroid Build Coastguard Worker  *    // The input stream JSON would be nested here.
388*44844408SAndroid Build Coastguard Worker  *    }
389*44844408SAndroid Build Coastguard Worker  * }
390*44844408SAndroid Build Coastguard Worker  * }
391*44844408SAndroid Build Coastguard Worker  * \endverbatim
392*44844408SAndroid Build Coastguard Worker  * \throw std::exception on parse error.
393*44844408SAndroid Build Coastguard Worker  * \see Json::operator<<()
394*44844408SAndroid Build Coastguard Worker  */
395*44844408SAndroid Build Coastguard Worker JSON_API IStream& operator>>(IStream&, Value&);
396*44844408SAndroid Build Coastguard Worker 
397*44844408SAndroid Build Coastguard Worker } // namespace Json
398*44844408SAndroid Build Coastguard Worker 
399*44844408SAndroid Build Coastguard Worker #pragma pack(pop)
400*44844408SAndroid Build Coastguard Worker 
401*44844408SAndroid Build Coastguard Worker #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
402*44844408SAndroid Build Coastguard Worker #pragma warning(pop)
403*44844408SAndroid Build Coastguard Worker #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
404*44844408SAndroid Build Coastguard Worker 
405*44844408SAndroid Build Coastguard Worker #endif // JSON_READER_H_INCLUDED
406