diff --git a/include/json/json.h b/include/json/json.h index 5c776a160..3d440454c 100644 --- a/include/json/json.h +++ b/include/json/json.h @@ -6,10 +6,10 @@ #ifndef JSON_JSON_H_INCLUDED #define JSON_JSON_H_INCLUDED -#include "config.h" -#include "json_features.h" -#include "reader.h" -#include "value.h" -#include "writer.h" +#include "config.h" // IWYU pragma: export +#include "json_features.h" // IWYU pragma: export +#include "reader.h" // IWYU pragma: export +#include "value.h" // IWYU pragma: export +#include "writer.h" // IWYU pragma: export #endif // JSON_JSON_H_INCLUDED diff --git a/include/json/reader.h b/include/json/reader.h index d745378fc..a0474796a 100644 --- a/include/json/reader.h +++ b/include/json/reader.h @@ -74,7 +74,7 @@ class JSON_API Reader { * \return \c true if the document was successfully parsed, \c false if an * error occurred. */ - bool parse(const std::string& document, Value& root, + bool parse(std::string_view document, Value& root, bool collectComments = true); /** \brief Read a Value from a JSON @@ -400,6 +400,9 @@ class JSON_API CharReaderBuilder : public CharReader::Factory { bool JSON_API parseFromStream(CharReader::Factory const&, IStream&, Value* root, String* errs); +bool JSON_API parseFromString(CharReader::Factory const&, std::string_view, + Value* root, JSONCPP_STRING* errs); + /** \brief Read from 'sin' into 'root'. * * Always keep comments from the input JSON. diff --git a/include/json/writer.h b/include/json/writer.h index 7c56a2107..8948a741f 100644 --- a/include/json/writer.h +++ b/include/json/writer.h @@ -143,6 +143,7 @@ class JSON_API StreamWriterBuilder : public StreamWriter::Factory { * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults */ static void setDefaults(Json::Value* settings); + static void updateDefaults(const Json::Value& settings); }; /** \brief Abstract class for writers. diff --git a/src/lib_json/json_reader.cpp b/src/lib_json/json_reader.cpp index 5b6299906..d04197cc2 100644 --- a/src/lib_json/json_reader.cpp +++ b/src/lib_json/json_reader.cpp @@ -78,7 +78,7 @@ Reader::Reader() : features_(Features::all()) {} Reader::Reader(const Features& features) : features_(features) {} -bool Reader::parse(const std::string& document, Value& root, +bool Reader::parse(std::string_view document, Value& root, bool collectComments) { document_.assign(document.begin(), document.end()); const char* begin = document_.c_str(); @@ -1992,6 +1992,15 @@ bool parseFromStream(CharReader::Factory const& fact, IStream& sin, Value* root, return reader->parse(begin, end, root, errs); } +bool parseFromString( + CharReader::Factory const& fact, std::string_view doc, Value* root, JSONCPP_STRING* errs) { + char const* begin = doc.data(); + char const* end = begin + doc.size(); + // Note that we do not actually need a null-terminator. + CharReaderPtr const reader(fact.newCharReader()); + return reader->parse(begin, end, root, errs); +} + IStream& operator>>(IStream& sin, Value& root) { CharReaderBuilder b; String errs; diff --git a/src/lib_json/json_writer.cpp b/src/lib_json/json_writer.cpp index ac14eb11f..c2897ff5a 100644 --- a/src/lib_json/json_writer.cpp +++ b/src/lib_json/json_writer.cpp @@ -1170,18 +1170,30 @@ bool StreamWriterBuilder::validate(Json::Value* invalid) const { Value& StreamWriterBuilder::operator[](const String& key) { return settings_[key]; } -// static -void StreamWriterBuilder::setDefaults(Json::Value* settings) { + +static Json::Value& global_settings_ = *new Json::Value([] { //! [StreamWriterBuilderDefaults] - (*settings)["commentStyle"] = "All"; - (*settings)["indentation"] = "\t"; - (*settings)["enableYAMLCompatibility"] = false; - (*settings)["dropNullPlaceholders"] = false; - (*settings)["useSpecialFloats"] = false; - (*settings)["emitUTF8"] = false; - (*settings)["precision"] = 17; - (*settings)["precisionType"] = "significant"; + Json::Value settings; + settings["commentStyle"] = "All"; + settings["indentation"] = "\t"; + settings["enableYAMLCompatibility"] = false; + settings["dropNullPlaceholders"] = false; + settings["useSpecialFloats"] = false; + settings["emitUTF8"] = false; + settings["precision"] = 17; + settings["precisionType"] = "significant"; //! [StreamWriterBuilderDefaults] + return settings; +}()); + +// static +void StreamWriterBuilder::setDefaults(Json::Value* settings) { + *settings = global_settings_; +} + +// static +void StreamWriterBuilder::updateDefaults(const Json::Value& settings) { + global_settings_ = settings; } String writeString(StreamWriter::Factory const& factory, Value const& root) {