2017-07-21 12:44:36 +02:00
|
|
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
2010-04-20 23:35:19 +02:00
|
|
|
// Distributed under MIT license, or public domain if desired and
|
|
|
|
// recognized in your jurisdiction.
|
|
|
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
|
|
|
|
2007-06-13 17:51:04 +02:00
|
|
|
#ifndef CPPTL_JSON_READER_H_INCLUDED
|
2014-07-01 00:48:54 +02:00
|
|
|
#define CPPTL_JSON_READER_H_INCLUDED
|
2007-06-13 17:51:04 +02:00
|
|
|
|
2011-05-02 23:09:30 +02:00
|
|
|
#if !defined(JSON_IS_AMALGAMATION)
|
2014-07-01 00:48:54 +02:00
|
|
|
#include "features.h"
|
|
|
|
#include "value.h"
|
2011-05-02 23:09:30 +02:00
|
|
|
#endif // if !defined(JSON_IS_AMALGAMATION)
|
2014-07-01 00:48:54 +02:00
|
|
|
#include <deque>
|
|
|
|
#include <iosfwd>
|
2018-05-20 22:55:27 +02:00
|
|
|
#include <istream>
|
2014-07-01 00:48:54 +02:00
|
|
|
#include <stack>
|
|
|
|
#include <string>
|
2007-06-13 17:51:04 +02:00
|
|
|
|
2014-07-01 00:48:54 +02:00
|
|
|
// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
|
|
|
// be used by...
|
2013-05-08 22:21:11 +02:00
|
|
|
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
2014-07-01 00:48:54 +02:00
|
|
|
#pragma warning(push)
|
|
|
|
#pragma warning(disable : 4251)
|
2013-05-08 22:21:11 +02:00
|
|
|
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
|
|
|
|
2016-12-03 21:29:14 +01:00
|
|
|
#pragma pack(push, 8)
|
|
|
|
|
2019-07-17 22:35:33 +02:00
|
|
|
#if defined(_MSC_VER)
|
|
|
|
#pragma warning(disable : 4996)
|
|
|
|
#endif
|
|
|
|
|
2007-06-13 17:51:04 +02:00
|
|
|
namespace Json {
|
|
|
|
|
2014-07-01 00:48:54 +02:00
|
|
|
/** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a
|
2019-07-15 00:41:48 +02:00
|
|
|
* Value.
|
2014-07-01 00:48:54 +02:00
|
|
|
*
|
2015-02-09 18:15:39 +01:00
|
|
|
* \deprecated Use CharReader and CharReaderBuilder.
|
2014-07-01 00:48:54 +02:00
|
|
|
*/
|
2019-07-17 22:35:33 +02:00
|
|
|
class [[deprecated("deprecated Use CharReader and CharReaderBuilder.")]] JSON_API Reader {
|
2014-07-01 00:48:54 +02:00
|
|
|
public:
|
|
|
|
typedef char Char;
|
2014-09-15 02:15:29 +02:00
|
|
|
typedef const Char* Location;
|
2014-07-01 00:48:54 +02:00
|
|
|
|
|
|
|
/** \brief An error tagged with where in the JSON text it was encountered.
|
|
|
|
*
|
|
|
|
* The offsets give the [start, limit) range of bytes within the text. Note
|
|
|
|
* that this is bytes, not codepoints.
|
|
|
|
*/
|
|
|
|
struct StructuredError {
|
2016-02-06 16:25:20 +01:00
|
|
|
ptrdiff_t offset_start;
|
|
|
|
ptrdiff_t offset_limit;
|
2019-01-17 22:35:29 +01:00
|
|
|
String message;
|
2014-07-01 00:48:54 +02:00
|
|
|
};
|
|
|
|
|
2019-07-15 00:41:48 +02:00
|
|
|
/** \brief Constructs a Reader allowing all features for parsing.
|
2014-07-01 00:48:54 +02:00
|
|
|
*/
|
|
|
|
Reader();
|
|
|
|
|
2019-07-15 00:41:48 +02:00
|
|
|
/** \brief Constructs a Reader allowing the specified feature set for parsing.
|
2014-07-01 00:48:54 +02:00
|
|
|
*/
|
2014-09-15 02:15:29 +02:00
|
|
|
Reader(const Features& features);
|
2014-07-01 00:48:54 +02:00
|
|
|
|
|
|
|
/** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
|
|
|
* document.
|
2019-07-15 00:41:48 +02:00
|
|
|
*
|
|
|
|
* \param document UTF-8 encoded string containing the document
|
|
|
|
* to read.
|
|
|
|
* \param[out] root Contains the root value of the document if it
|
|
|
|
* was successfully parsed.
|
|
|
|
* \param collectComments \c true to collect comment and allow writing
|
|
|
|
* them back during serialization, \c false to
|
|
|
|
* discard comments. This parameter is ignored
|
|
|
|
* if Features::allowComments_ is \c false.
|
2014-07-01 00:48:54 +02:00
|
|
|
* \return \c true if the document was successfully parsed, \c false if an
|
|
|
|
* error occurred.
|
2007-06-13 17:51:04 +02:00
|
|
|
*/
|
2014-07-01 00:48:54 +02:00
|
|
|
bool
|
2014-09-15 02:15:29 +02:00
|
|
|
parse(const std::string& document, Value& root, bool collectComments = true);
|
2014-07-01 00:48:54 +02:00
|
|
|
|
|
|
|
/** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
2019-07-15 00:41:48 +02:00
|
|
|
* document.
|
|
|
|
*
|
|
|
|
* \param beginDoc Pointer on the beginning of the UTF-8 encoded
|
|
|
|
* string of the document to read.
|
|
|
|
* \param endDoc Pointer on the end of the UTF-8 encoded string
|
|
|
|
* of the document to read. Must be >= beginDoc.
|
|
|
|
* \param[out] root Contains the root value of the document if it
|
|
|
|
* was successfully parsed.
|
|
|
|
* \param collectComments \c true to collect comment and allow writing
|
|
|
|
* them back during serialization, \c false to
|
|
|
|
* discard comments. This parameter is ignored
|
|
|
|
* if Features::allowComments_ is \c false.
|
2014-07-01 00:48:54 +02:00
|
|
|
* \return \c true if the document was successfully parsed, \c false if an
|
2019-07-15 00:41:48 +02:00
|
|
|
* error occurred.
|
2014-07-01 00:48:54 +02:00
|
|
|
*/
|
2014-09-15 02:15:29 +02:00
|
|
|
bool parse(const char* beginDoc,
|
|
|
|
const char* endDoc,
|
|
|
|
Value& root,
|
2014-07-01 00:48:54 +02:00
|
|
|
bool collectComments = true);
|
|
|
|
|
|
|
|
/// \brief Parse from input stream.
|
|
|
|
/// \see Json::operator>>(std::istream&, Json::Value&).
|
2019-01-17 22:35:29 +01:00
|
|
|
bool parse(IStream& is, Value& root, bool collectComments = true);
|
2014-07-01 00:48:54 +02:00
|
|
|
|
|
|
|
/** \brief Returns a user friendly string that list errors in the parsed
|
|
|
|
* document.
|
2019-07-15 00:41:48 +02:00
|
|
|
*
|
|
|
|
* \return Formatted error message with the list of errors with their
|
|
|
|
* location in the parsed document. An empty string is returned if no error
|
|
|
|
* occurred during parsing.
|
2014-07-01 00:48:54 +02:00
|
|
|
* \deprecated Use getFormattedErrorMessages() instead (typo fix).
|
|
|
|
*/
|
2019-07-17 22:35:33 +02:00
|
|
|
[[deprecated("Use getFormattedErrorMessages() instead.")]]
|
2019-01-17 22:35:29 +01:00
|
|
|
String getFormatedErrorMessages() const;
|
2014-07-01 00:48:54 +02:00
|
|
|
|
|
|
|
/** \brief Returns a user friendly string that list errors in the parsed
|
|
|
|
* document.
|
2019-07-15 00:41:48 +02:00
|
|
|
*
|
|
|
|
* \return Formatted error message with the list of errors with their
|
|
|
|
* location in the parsed document. An empty string is returned if no error
|
|
|
|
* occurred during parsing.
|
2014-07-01 00:48:54 +02:00
|
|
|
*/
|
2019-01-17 22:35:29 +01:00
|
|
|
String getFormattedErrorMessages() const;
|
2014-07-01 00:48:54 +02:00
|
|
|
|
|
|
|
/** \brief Returns a vector of structured erros encounted while parsing.
|
2019-07-15 00:41:48 +02:00
|
|
|
*
|
2014-07-01 00:48:54 +02:00
|
|
|
* \return A (possibly empty) vector of StructuredError objects. Currently
|
2019-07-15 00:41:48 +02:00
|
|
|
* only one error can be returned, but the caller should tolerate multiple
|
|
|
|
* errors. This can occur if the parser recovers from a non-fatal parse
|
|
|
|
* error and then encounters additional errors.
|
2014-07-01 00:48:54 +02:00
|
|
|
*/
|
|
|
|
std::vector<StructuredError> getStructuredErrors() const;
|
|
|
|
|
2014-10-23 09:03:43 +02:00
|
|
|
/** \brief Add a semantic error message.
|
2019-07-15 00:41:48 +02:00
|
|
|
*
|
|
|
|
* \param value JSON Value location associated with the error
|
2014-10-23 09:03:43 +02:00
|
|
|
* \param message The error message.
|
2019-07-15 00:41:48 +02:00
|
|
|
* \return \c true if the error was successfully added, \c false if the Value
|
|
|
|
* offset exceeds the document size.
|
2014-10-23 09:03:43 +02:00
|
|
|
*/
|
2019-01-17 22:35:29 +01:00
|
|
|
bool pushError(const Value& value, const String& message);
|
2014-10-23 09:03:43 +02:00
|
|
|
|
|
|
|
/** \brief Add a semantic error message with extra context.
|
2019-07-15 00:41:48 +02:00
|
|
|
*
|
|
|
|
* \param value JSON Value location associated with the error
|
2014-10-23 09:03:43 +02:00
|
|
|
* \param message The error message.
|
2019-07-15 00:41:48 +02:00
|
|
|
* \param extra Additional JSON Value location to contextualize the error
|
2014-10-23 09:03:43 +02:00
|
|
|
* \return \c true if the error was successfully added, \c false if either
|
|
|
|
* Value offset exceeds the document size.
|
|
|
|
*/
|
2019-01-17 22:35:29 +01:00
|
|
|
bool pushError(const Value& value, const String& message, const Value& extra);
|
2014-10-23 09:03:43 +02:00
|
|
|
|
|
|
|
/** \brief Return whether there are any errors.
|
2019-07-15 00:41:48 +02:00
|
|
|
*
|
|
|
|
* \return \c true if there are no errors to report \c false if errors have
|
|
|
|
* occurred.
|
2014-10-23 09:03:43 +02:00
|
|
|
*/
|
|
|
|
bool good() const;
|
|
|
|
|
2014-07-01 00:48:54 +02:00
|
|
|
private:
|
|
|
|
enum TokenType {
|
|
|
|
tokenEndOfStream = 0,
|
|
|
|
tokenObjectBegin,
|
|
|
|
tokenObjectEnd,
|
|
|
|
tokenArrayBegin,
|
|
|
|
tokenArrayEnd,
|
|
|
|
tokenString,
|
|
|
|
tokenNumber,
|
|
|
|
tokenTrue,
|
|
|
|
tokenFalse,
|
|
|
|
tokenNull,
|
|
|
|
tokenArraySeparator,
|
|
|
|
tokenMemberSeparator,
|
|
|
|
tokenComment,
|
|
|
|
tokenError
|
|
|
|
};
|
|
|
|
|
|
|
|
class Token {
|
|
|
|
public:
|
|
|
|
TokenType type_;
|
|
|
|
Location start_;
|
|
|
|
Location end_;
|
|
|
|
};
|
|
|
|
|
|
|
|
class ErrorInfo {
|
|
|
|
public:
|
|
|
|
Token token_;
|
2019-01-17 22:35:29 +01:00
|
|
|
String message_;
|
2014-07-01 00:48:54 +02:00
|
|
|
Location extra_;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef std::deque<ErrorInfo> Errors;
|
|
|
|
|
2014-09-15 02:15:29 +02:00
|
|
|
bool readToken(Token& token);
|
2014-07-01 00:48:54 +02:00
|
|
|
void skipSpaces();
|
|
|
|
bool match(Location pattern, int patternLength);
|
|
|
|
bool readComment();
|
|
|
|
bool readCStyleComment();
|
|
|
|
bool readCppStyleComment();
|
|
|
|
bool readString();
|
|
|
|
void readNumber();
|
|
|
|
bool readValue();
|
2014-09-15 02:15:29 +02:00
|
|
|
bool readObject(Token& token);
|
|
|
|
bool readArray(Token& token);
|
|
|
|
bool decodeNumber(Token& token);
|
|
|
|
bool decodeNumber(Token& token, Value& decoded);
|
|
|
|
bool decodeString(Token& token);
|
2019-01-17 22:35:29 +01:00
|
|
|
bool decodeString(Token& token, String& decoded);
|
2014-09-15 02:15:29 +02:00
|
|
|
bool decodeDouble(Token& token);
|
|
|
|
bool decodeDouble(Token& token, Value& decoded);
|
|
|
|
bool decodeUnicodeCodePoint(Token& token,
|
|
|
|
Location& current,
|
2014-07-01 00:48:54 +02:00
|
|
|
Location end,
|
2014-09-15 02:15:29 +02:00
|
|
|
unsigned int& unicode);
|
|
|
|
bool decodeUnicodeEscapeSequence(Token& token,
|
|
|
|
Location& current,
|
2014-07-01 00:48:54 +02:00
|
|
|
Location end,
|
2014-09-15 02:15:29 +02:00
|
|
|
unsigned int& unicode);
|
2019-01-17 22:35:29 +01:00
|
|
|
bool addError(const String& message, Token& token, Location extra = nullptr);
|
2014-07-01 00:48:54 +02:00
|
|
|
bool recoverFromError(TokenType skipUntilToken);
|
2019-01-17 22:35:29 +01:00
|
|
|
bool addErrorAndRecover(const String& message,
|
2014-09-15 02:15:29 +02:00
|
|
|
Token& token,
|
2014-07-01 00:48:54 +02:00
|
|
|
TokenType skipUntilToken);
|
|
|
|
void skipUntilSpace();
|
2014-09-15 02:15:29 +02:00
|
|
|
Value& currentValue();
|
2014-07-01 00:48:54 +02:00
|
|
|
Char getNextChar();
|
|
|
|
void
|
2014-09-15 02:15:29 +02:00
|
|
|
getLocationLineAndColumn(Location location, int& line, int& column) const;
|
2019-01-17 22:35:29 +01:00
|
|
|
String getLocationLineAndColumn(Location location) const;
|
2014-07-01 00:48:54 +02:00
|
|
|
void addComment(Location begin, Location end, CommentPlacement placement);
|
2014-09-15 02:15:29 +02:00
|
|
|
void skipCommentTokens(Token& token);
|
2014-07-01 00:48:54 +02:00
|
|
|
|
2017-08-03 07:44:42 +02:00
|
|
|
static bool containsNewLine(Location begin, Location end);
|
2019-01-17 22:35:29 +01:00
|
|
|
static String normalizeEOL(Location begin, Location end);
|
2017-08-03 07:44:42 +02:00
|
|
|
|
2014-09-15 02:15:29 +02:00
|
|
|
typedef std::stack<Value*> Nodes;
|
2014-07-01 00:48:54 +02:00
|
|
|
Nodes nodes_;
|
|
|
|
Errors errors_;
|
2019-01-17 22:35:29 +01:00
|
|
|
String document_;
|
2019-01-15 00:09:22 +01:00
|
|
|
Location begin_{};
|
|
|
|
Location end_{};
|
|
|
|
Location current_{};
|
|
|
|
Location lastValueEnd_{};
|
|
|
|
Value* lastValue_{};
|
2019-01-17 22:35:29 +01:00
|
|
|
String commentsBefore_;
|
2014-07-01 00:48:54 +02:00
|
|
|
Features features_;
|
2019-01-15 00:09:22 +01:00
|
|
|
bool collectComments_{};
|
2018-05-20 22:55:27 +02:00
|
|
|
}; // Reader
|
2015-01-29 21:29:40 +01:00
|
|
|
|
|
|
|
/** Interface for reading JSON from a char array.
|
|
|
|
*/
|
|
|
|
class JSON_API CharReader {
|
|
|
|
public:
|
2019-01-15 00:09:26 +01:00
|
|
|
virtual ~CharReader() = default;
|
2015-01-29 21:29:40 +01:00
|
|
|
/** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
2019-07-15 00:41:48 +02:00
|
|
|
* document. The document must be a UTF-8 encoded string containing the
|
|
|
|
* document to read.
|
2015-01-29 21:29:40 +01:00
|
|
|
*
|
2019-07-15 00:41:48 +02:00
|
|
|
* \param beginDoc Pointer on the beginning of the UTF-8 encoded string
|
|
|
|
* of the document to read.
|
|
|
|
* \param endDoc Pointer on the end of the UTF-8 encoded string of the
|
|
|
|
* document to read. Must be >= beginDoc.
|
|
|
|
* \param[out] root Contains the root value of the document if it was
|
|
|
|
* successfully parsed.
|
|
|
|
* \param[out] errs Formatted error messages (if not NULL) a user
|
|
|
|
* friendly string that lists errors in the parsed
|
|
|
|
* document.
|
2015-01-29 21:29:40 +01:00
|
|
|
* \return \c true if the document was successfully parsed, \c false if an
|
2019-07-15 00:41:48 +02:00
|
|
|
* error occurred.
|
2015-01-29 21:29:40 +01:00
|
|
|
*/
|
2018-05-20 22:55:27 +02:00
|
|
|
virtual bool parse(char const* beginDoc,
|
|
|
|
char const* endDoc,
|
|
|
|
Value* root,
|
2019-01-17 22:35:29 +01:00
|
|
|
String* errs) = 0;
|
2015-01-29 21:29:40 +01:00
|
|
|
|
2015-09-28 21:45:11 +02:00
|
|
|
class JSON_API Factory {
|
2015-01-29 21:29:40 +01:00
|
|
|
public:
|
2019-01-15 00:09:26 +01:00
|
|
|
virtual ~Factory() = default;
|
2015-02-10 00:22:28 +01:00
|
|
|
/** \brief Allocate a CharReader via operator new().
|
|
|
|
* \throw std::exception if something goes wrong (e.g. invalid settings)
|
|
|
|
*/
|
2015-01-29 21:29:40 +01:00
|
|
|
virtual CharReader* newCharReader() const = 0;
|
2018-05-20 22:55:27 +02:00
|
|
|
}; // Factory
|
|
|
|
}; // CharReader
|
2015-01-29 21:29:40 +01:00
|
|
|
|
2015-02-09 08:29:43 +01:00
|
|
|
/** \brief Build a CharReader implementation.
|
2019-07-15 00:41:48 +02:00
|
|
|
*
|
|
|
|
* Usage:
|
|
|
|
* \code
|
|
|
|
* using namespace Json;
|
|
|
|
* CharReaderBuilder builder;
|
|
|
|
* builder["collectComments"] = false;
|
|
|
|
* Value value;
|
|
|
|
* String errs;
|
|
|
|
* bool ok = parseFromStream(builder, std::cin, &value, &errs);
|
|
|
|
* \endcode
|
|
|
|
*/
|
2015-02-10 00:22:28 +01:00
|
|
|
class JSON_API CharReaderBuilder : public CharReader::Factory {
|
2015-02-09 08:29:43 +01:00
|
|
|
public:
|
2015-02-10 00:22:28 +01:00
|
|
|
// Note: We use a Json::Value so that we can add data-members to this class
|
|
|
|
// without a major version bump.
|
|
|
|
/** Configuration of this builder.
|
2019-07-15 00:41:48 +02:00
|
|
|
* These are case-sensitive.
|
|
|
|
* Available settings (case-sensitive):
|
|
|
|
* - `"collectComments": false or true`
|
|
|
|
* - true to collect comment and allow writing them back during
|
|
|
|
* serialization, false to discard comments. This parameter is ignored
|
|
|
|
* if allowComments is false.
|
|
|
|
* - `"allowComments": false or true`
|
|
|
|
* - true if comments are allowed.
|
|
|
|
* - `"strictRoot": false or true`
|
|
|
|
* - true if root must be either an array or an object value
|
|
|
|
* - `"allowDroppedNullPlaceholders": false or true`
|
|
|
|
* - true if dropped null placeholders are allowed. (See
|
|
|
|
* StreamWriterBuilder.)
|
|
|
|
* - `"allowNumericKeys": false or true`
|
|
|
|
* - true if numeric object keys are allowed.
|
|
|
|
* - `"allowSingleQuotes": false or true`
|
|
|
|
* - true if '' are allowed for strings (both keys and values)
|
|
|
|
* - `"stackLimit": integer`
|
|
|
|
* - Exceeding stackLimit (recursive depth of `readValue()`) will cause an
|
|
|
|
* exception.
|
|
|
|
* - This is a security issue (seg-faults caused by deeply nested JSON), so
|
|
|
|
* the default is low.
|
|
|
|
* - `"failIfExtra": false or true`
|
|
|
|
* - If true, `parse()` returns false when extra non-whitespace trails the
|
|
|
|
* JSON value in the input string.
|
|
|
|
* - `"rejectDupKeys": false or true`
|
|
|
|
* - If true, `parse()` returns false when a key is duplicated within an
|
|
|
|
* object.
|
|
|
|
* - `"allowSpecialFloats": false or true`
|
|
|
|
* - If true, special float values (NaNs and infinities) are allowed and
|
|
|
|
* their values are lossfree restorable.
|
|
|
|
*
|
|
|
|
* You can examine 'settings_` yourself to see the defaults. You can also
|
|
|
|
* write and read them just like any JSON Value.
|
|
|
|
* \sa setDefaults()
|
|
|
|
*/
|
2015-02-10 00:22:28 +01:00
|
|
|
Json::Value settings_;
|
2015-01-29 21:29:40 +01:00
|
|
|
|
2015-02-09 08:29:43 +01:00
|
|
|
CharReaderBuilder();
|
2019-01-11 20:58:53 +01:00
|
|
|
~CharReaderBuilder() override;
|
2015-01-29 21:29:40 +01:00
|
|
|
|
2019-01-11 20:58:53 +01:00
|
|
|
CharReader* newCharReader() const override;
|
2015-02-10 00:22:28 +01:00
|
|
|
|
2015-02-10 01:24:56 +01:00
|
|
|
/** \return true if 'settings' are legal and consistent;
|
2015-02-10 00:22:28 +01:00
|
|
|
* otherwise, indicate bad settings via 'invalid'.
|
|
|
|
*/
|
|
|
|
bool validate(Json::Value* invalid) const;
|
2015-03-04 21:56:37 +01:00
|
|
|
|
|
|
|
/** A simple way to update a specific setting.
|
|
|
|
*/
|
2019-01-17 22:35:29 +01:00
|
|
|
Value& operator[](const String& key);
|
2015-03-04 21:56:37 +01:00
|
|
|
|
2015-02-10 00:22:28 +01:00
|
|
|
/** Called by ctor, but you can use this to reset settings_.
|
|
|
|
* \pre 'settings' != NULL (but Json::null is fine)
|
2015-02-10 01:16:24 +01:00
|
|
|
* \remark Defaults:
|
2015-04-20 22:10:31 +02:00
|
|
|
* \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults
|
2015-02-10 00:22:28 +01:00
|
|
|
*/
|
|
|
|
static void setDefaults(Json::Value* settings);
|
2015-02-10 01:16:24 +01:00
|
|
|
/** Same as old Features::strictMode().
|
|
|
|
* \pre 'settings' != NULL (but Json::null is fine)
|
|
|
|
* \remark Defaults:
|
2015-04-20 22:10:31 +02:00
|
|
|
* \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode
|
2015-02-10 01:16:24 +01:00
|
|
|
*/
|
|
|
|
static void strictMode(Json::Value* settings);
|
2014-07-01 00:48:54 +02:00
|
|
|
};
|
|
|
|
|
2015-01-29 21:29:40 +01:00
|
|
|
/** Consume entire stream and use its begin/end.
|
2018-05-20 22:55:27 +02:00
|
|
|
* Someday we might have a real StreamReader, but for now this
|
|
|
|
* is convenient.
|
|
|
|
*/
|
|
|
|
bool JSON_API parseFromStream(CharReader::Factory const&,
|
2019-01-17 22:35:29 +01:00
|
|
|
IStream&,
|
2018-05-20 22:55:27 +02:00
|
|
|
Value* root,
|
2019-07-11 03:56:30 +02:00
|
|
|
String* errs);
|
2015-01-29 21:29:40 +01:00
|
|
|
|
2014-07-01 00:48:54 +02:00
|
|
|
/** \brief Read from 'sin' into 'root'.
|
2019-07-15 00:41:48 +02:00
|
|
|
*
|
|
|
|
* Always keep comments from the input JSON.
|
2019-07-31 20:26:48 +02:00
|
|
|
*
|
2019-07-15 00:41:48 +02:00
|
|
|
* This can be used to read a file into a particular sub-object.
|
|
|
|
* For example:
|
|
|
|
* \code
|
|
|
|
* Json::Value root;
|
|
|
|
* cin >> root["dir"]["file"];
|
|
|
|
* cout << root;
|
|
|
|
* \endcode
|
|
|
|
* Result:
|
|
|
|
* \verbatim
|
|
|
|
* {
|
|
|
|
* "dir": {
|
|
|
|
* "file": {
|
|
|
|
* // The input stream JSON would be nested here.
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* \endverbatim
|
|
|
|
* \throw std::exception on parse error.
|
|
|
|
* \see Json::operator<<()
|
|
|
|
*/
|
2019-01-17 22:35:29 +01:00
|
|
|
JSON_API IStream& operator>>(IStream&, Value&);
|
2007-06-13 17:51:04 +02:00
|
|
|
|
|
|
|
} // namespace Json
|
|
|
|
|
2016-12-03 21:29:14 +01:00
|
|
|
#pragma pack(pop)
|
|
|
|
|
2013-05-08 22:21:11 +02:00
|
|
|
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
2014-07-01 00:48:54 +02:00
|
|
|
#pragma warning(pop)
|
2013-05-08 22:21:11 +02:00
|
|
|
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
|
|
|
|
2007-06-13 17:51:04 +02:00
|
|
|
#endif // CPPTL_JSON_READER_H_INCLUDED
|