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