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_WRITER_H_INCLUDED 7*44844408SAndroid Build Coastguard Worker #define JSON_WRITER_H_INCLUDED 8*44844408SAndroid Build Coastguard Worker 9*44844408SAndroid Build Coastguard Worker #if !defined(JSON_IS_AMALGAMATION) 10*44844408SAndroid Build Coastguard Worker #include "value.h" 11*44844408SAndroid Build Coastguard Worker #endif // if !defined(JSON_IS_AMALGAMATION) 12*44844408SAndroid Build Coastguard Worker #include <ostream> 13*44844408SAndroid Build Coastguard Worker #include <string> 14*44844408SAndroid Build Coastguard Worker #include <vector> 15*44844408SAndroid Build Coastguard Worker 16*44844408SAndroid Build Coastguard Worker // Disable warning C4251: <data member>: <type> needs to have dll-interface to 17*44844408SAndroid Build Coastguard Worker // be used by... 18*44844408SAndroid Build Coastguard Worker #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) && defined(_MSC_VER) 19*44844408SAndroid Build Coastguard Worker #pragma warning(push) 20*44844408SAndroid Build Coastguard Worker #pragma warning(disable : 4251) 21*44844408SAndroid Build Coastguard Worker #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) 22*44844408SAndroid Build Coastguard Worker 23*44844408SAndroid Build Coastguard Worker #pragma pack(push, 8) 24*44844408SAndroid Build Coastguard Worker 25*44844408SAndroid Build Coastguard Worker namespace Json { 26*44844408SAndroid Build Coastguard Worker 27*44844408SAndroid Build Coastguard Worker class Value; 28*44844408SAndroid Build Coastguard Worker 29*44844408SAndroid Build Coastguard Worker /** 30*44844408SAndroid Build Coastguard Worker * 31*44844408SAndroid Build Coastguard Worker * Usage: 32*44844408SAndroid Build Coastguard Worker * \code 33*44844408SAndroid Build Coastguard Worker * using namespace Json; 34*44844408SAndroid Build Coastguard Worker * void writeToStdout(StreamWriter::Factory const& factory, Value const& value) 35*44844408SAndroid Build Coastguard Worker * { std::unique_ptr<StreamWriter> const writer( factory.newStreamWriter()); 36*44844408SAndroid Build Coastguard Worker * writer->write(value, &std::cout); 37*44844408SAndroid Build Coastguard Worker * std::cout << std::endl; // add lf and flush 38*44844408SAndroid Build Coastguard Worker * } 39*44844408SAndroid Build Coastguard Worker * \endcode 40*44844408SAndroid Build Coastguard Worker */ 41*44844408SAndroid Build Coastguard Worker class JSON_API StreamWriter { 42*44844408SAndroid Build Coastguard Worker protected: 43*44844408SAndroid Build Coastguard Worker OStream* sout_; // not owned; will not delete 44*44844408SAndroid Build Coastguard Worker public: 45*44844408SAndroid Build Coastguard Worker StreamWriter(); 46*44844408SAndroid Build Coastguard Worker virtual ~StreamWriter(); 47*44844408SAndroid Build Coastguard Worker /** Write Value into document as configured in sub-class. 48*44844408SAndroid Build Coastguard Worker * Do not take ownership of sout, but maintain a reference during function. 49*44844408SAndroid Build Coastguard Worker * \pre sout != NULL 50*44844408SAndroid Build Coastguard Worker * \return zero on success (For now, we always return zero, so check the 51*44844408SAndroid Build Coastguard Worker * stream instead.) \throw std::exception possibly, depending on 52*44844408SAndroid Build Coastguard Worker * configuration 53*44844408SAndroid Build Coastguard Worker */ 54*44844408SAndroid Build Coastguard Worker virtual int write(Value const& root, OStream* sout) = 0; 55*44844408SAndroid Build Coastguard Worker 56*44844408SAndroid Build Coastguard Worker /** \brief A simple abstract factory. 57*44844408SAndroid Build Coastguard Worker */ 58*44844408SAndroid Build Coastguard Worker class JSON_API Factory { 59*44844408SAndroid Build Coastguard Worker public: 60*44844408SAndroid Build Coastguard Worker virtual ~Factory(); 61*44844408SAndroid Build Coastguard Worker /** \brief Allocate a CharReader via operator new(). 62*44844408SAndroid Build Coastguard Worker * \throw std::exception if something goes wrong (e.g. invalid settings) 63*44844408SAndroid Build Coastguard Worker */ 64*44844408SAndroid Build Coastguard Worker virtual StreamWriter* newStreamWriter() const = 0; 65*44844408SAndroid Build Coastguard Worker }; // Factory 66*44844408SAndroid Build Coastguard Worker }; // StreamWriter 67*44844408SAndroid Build Coastguard Worker 68*44844408SAndroid Build Coastguard Worker /** \brief Write into stringstream, then return string, for convenience. 69*44844408SAndroid Build Coastguard Worker * A StreamWriter will be created from the factory, used, and then deleted. 70*44844408SAndroid Build Coastguard Worker */ 71*44844408SAndroid Build Coastguard Worker String JSON_API writeString(StreamWriter::Factory const& factory, 72*44844408SAndroid Build Coastguard Worker Value const& root); 73*44844408SAndroid Build Coastguard Worker 74*44844408SAndroid Build Coastguard Worker /** \brief Build a StreamWriter implementation. 75*44844408SAndroid Build Coastguard Worker 76*44844408SAndroid Build Coastguard Worker * Usage: 77*44844408SAndroid Build Coastguard Worker * \code 78*44844408SAndroid Build Coastguard Worker * using namespace Json; 79*44844408SAndroid Build Coastguard Worker * Value value = ...; 80*44844408SAndroid Build Coastguard Worker * StreamWriterBuilder builder; 81*44844408SAndroid Build Coastguard Worker * builder["commentStyle"] = "None"; 82*44844408SAndroid Build Coastguard Worker * builder["indentation"] = " "; // or whatever you like 83*44844408SAndroid Build Coastguard Worker * std::unique_ptr<Json::StreamWriter> writer( 84*44844408SAndroid Build Coastguard Worker * builder.newStreamWriter()); 85*44844408SAndroid Build Coastguard Worker * writer->write(value, &std::cout); 86*44844408SAndroid Build Coastguard Worker * std::cout << std::endl; // add lf and flush 87*44844408SAndroid Build Coastguard Worker * \endcode 88*44844408SAndroid Build Coastguard Worker */ 89*44844408SAndroid Build Coastguard Worker class JSON_API StreamWriterBuilder : public StreamWriter::Factory { 90*44844408SAndroid Build Coastguard Worker public: 91*44844408SAndroid Build Coastguard Worker // Note: We use a Json::Value so that we can add data-members to this class 92*44844408SAndroid Build Coastguard Worker // without a major version bump. 93*44844408SAndroid Build Coastguard Worker /** Configuration of this builder. 94*44844408SAndroid Build Coastguard Worker * Available settings (case-sensitive): 95*44844408SAndroid Build Coastguard Worker * - "commentStyle": "None" or "All" 96*44844408SAndroid Build Coastguard Worker * - "indentation": "<anything>". 97*44844408SAndroid Build Coastguard Worker * - Setting this to an empty string also omits newline characters. 98*44844408SAndroid Build Coastguard Worker * - "enableYAMLCompatibility": false or true 99*44844408SAndroid Build Coastguard Worker * - slightly change the whitespace around colons 100*44844408SAndroid Build Coastguard Worker * - "dropNullPlaceholders": false or true 101*44844408SAndroid Build Coastguard Worker * - Drop the "null" string from the writer's output for nullValues. 102*44844408SAndroid Build Coastguard Worker * Strictly speaking, this is not valid JSON. But when the output is being 103*44844408SAndroid Build Coastguard Worker * fed to a browser's JavaScript, it makes for smaller output and the 104*44844408SAndroid Build Coastguard Worker * browser can handle the output just fine. 105*44844408SAndroid Build Coastguard Worker * - "useSpecialFloats": false or true 106*44844408SAndroid Build Coastguard Worker * - If true, outputs non-finite floating point values in the following way: 107*44844408SAndroid Build Coastguard Worker * NaN values as "NaN", positive infinity as "Infinity", and negative 108*44844408SAndroid Build Coastguard Worker * infinity as "-Infinity". 109*44844408SAndroid Build Coastguard Worker * - "precision": int 110*44844408SAndroid Build Coastguard Worker * - Number of precision digits for formatting of real values. 111*44844408SAndroid Build Coastguard Worker * - "precisionType": "significant"(default) or "decimal" 112*44844408SAndroid Build Coastguard Worker * - Type of precision for formatting of real values. 113*44844408SAndroid Build Coastguard Worker * - "emitUTF8": false or true 114*44844408SAndroid Build Coastguard Worker * - If true, outputs raw UTF8 strings instead of escaping them. 115*44844408SAndroid Build Coastguard Worker 116*44844408SAndroid Build Coastguard Worker * You can examine 'settings_` yourself 117*44844408SAndroid Build Coastguard Worker * to see the defaults. You can also write and read them just like any 118*44844408SAndroid Build Coastguard Worker * JSON Value. 119*44844408SAndroid Build Coastguard Worker * \sa setDefaults() 120*44844408SAndroid Build Coastguard Worker */ 121*44844408SAndroid Build Coastguard Worker Json::Value settings_; 122*44844408SAndroid Build Coastguard Worker 123*44844408SAndroid Build Coastguard Worker StreamWriterBuilder(); 124*44844408SAndroid Build Coastguard Worker ~StreamWriterBuilder() override; 125*44844408SAndroid Build Coastguard Worker 126*44844408SAndroid Build Coastguard Worker /** 127*44844408SAndroid Build Coastguard Worker * \throw std::exception if something goes wrong (e.g. invalid settings) 128*44844408SAndroid Build Coastguard Worker */ 129*44844408SAndroid Build Coastguard Worker StreamWriter* newStreamWriter() const override; 130*44844408SAndroid Build Coastguard Worker 131*44844408SAndroid Build Coastguard Worker /** \return true if 'settings' are legal and consistent; 132*44844408SAndroid Build Coastguard Worker * otherwise, indicate bad settings via 'invalid'. 133*44844408SAndroid Build Coastguard Worker */ 134*44844408SAndroid Build Coastguard Worker bool validate(Json::Value* invalid) const; 135*44844408SAndroid Build Coastguard Worker /** A simple way to update a specific setting. 136*44844408SAndroid Build Coastguard Worker */ 137*44844408SAndroid Build Coastguard Worker Value& operator[](const String& key); 138*44844408SAndroid Build Coastguard Worker 139*44844408SAndroid Build Coastguard Worker /** Called by ctor, but you can use this to reset settings_. 140*44844408SAndroid Build Coastguard Worker * \pre 'settings' != NULL (but Json::null is fine) 141*44844408SAndroid Build Coastguard Worker * \remark Defaults: 142*44844408SAndroid Build Coastguard Worker * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults 143*44844408SAndroid Build Coastguard Worker */ 144*44844408SAndroid Build Coastguard Worker static void setDefaults(Json::Value* settings); 145*44844408SAndroid Build Coastguard Worker }; 146*44844408SAndroid Build Coastguard Worker 147*44844408SAndroid Build Coastguard Worker /** \brief Abstract class for writers. 148*44844408SAndroid Build Coastguard Worker * \deprecated Use StreamWriter. (And really, this is an implementation detail.) 149*44844408SAndroid Build Coastguard Worker */ 150*44844408SAndroid Build Coastguard Worker class JSON_API Writer { 151*44844408SAndroid Build Coastguard Worker public: 152*44844408SAndroid Build Coastguard Worker virtual ~Writer(); 153*44844408SAndroid Build Coastguard Worker 154*44844408SAndroid Build Coastguard Worker virtual String write(const Value& root) = 0; 155*44844408SAndroid Build Coastguard Worker }; 156*44844408SAndroid Build Coastguard Worker 157*44844408SAndroid Build Coastguard Worker /** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format 158*44844408SAndroid Build Coastguard Worker *without formatting (not human friendly). 159*44844408SAndroid Build Coastguard Worker * 160*44844408SAndroid Build Coastguard Worker * The JSON document is written in a single line. It is not intended for 'human' 161*44844408SAndroid Build Coastguard Worker *consumption, 162*44844408SAndroid Build Coastguard Worker * but may be useful to support feature such as RPC where bandwidth is limited. 163*44844408SAndroid Build Coastguard Worker * \sa Reader, Value 164*44844408SAndroid Build Coastguard Worker * \deprecated Use StreamWriterBuilder. 165*44844408SAndroid Build Coastguard Worker */ 166*44844408SAndroid Build Coastguard Worker #if defined(_MSC_VER) 167*44844408SAndroid Build Coastguard Worker #pragma warning(push) 168*44844408SAndroid Build Coastguard Worker #pragma warning(disable : 4996) // Deriving from deprecated class 169*44844408SAndroid Build Coastguard Worker #endif 170*44844408SAndroid Build Coastguard Worker class JSON_API FastWriter 171*44844408SAndroid Build Coastguard Worker : public Writer { 172*44844408SAndroid Build Coastguard Worker public: 173*44844408SAndroid Build Coastguard Worker FastWriter(); 174*44844408SAndroid Build Coastguard Worker ~FastWriter() override = default; 175*44844408SAndroid Build Coastguard Worker 176*44844408SAndroid Build Coastguard Worker void enableYAMLCompatibility(); 177*44844408SAndroid Build Coastguard Worker 178*44844408SAndroid Build Coastguard Worker /** \brief Drop the "null" string from the writer's output for nullValues. 179*44844408SAndroid Build Coastguard Worker * Strictly speaking, this is not valid JSON. But when the output is being 180*44844408SAndroid Build Coastguard Worker * fed to a browser's JavaScript, it makes for smaller output and the 181*44844408SAndroid Build Coastguard Worker * browser can handle the output just fine. 182*44844408SAndroid Build Coastguard Worker */ 183*44844408SAndroid Build Coastguard Worker void dropNullPlaceholders(); 184*44844408SAndroid Build Coastguard Worker 185*44844408SAndroid Build Coastguard Worker void omitEndingLineFeed(); 186*44844408SAndroid Build Coastguard Worker 187*44844408SAndroid Build Coastguard Worker public: // overridden from Writer 188*44844408SAndroid Build Coastguard Worker String write(const Value& root) override; 189*44844408SAndroid Build Coastguard Worker 190*44844408SAndroid Build Coastguard Worker private: 191*44844408SAndroid Build Coastguard Worker void writeValue(const Value& value); 192*44844408SAndroid Build Coastguard Worker 193*44844408SAndroid Build Coastguard Worker String document_; 194*44844408SAndroid Build Coastguard Worker bool yamlCompatibilityEnabled_{false}; 195*44844408SAndroid Build Coastguard Worker bool dropNullPlaceholders_{false}; 196*44844408SAndroid Build Coastguard Worker bool omitEndingLineFeed_{false}; 197*44844408SAndroid Build Coastguard Worker }; 198*44844408SAndroid Build Coastguard Worker #if defined(_MSC_VER) 199*44844408SAndroid Build Coastguard Worker #pragma warning(pop) 200*44844408SAndroid Build Coastguard Worker #endif 201*44844408SAndroid Build Coastguard Worker 202*44844408SAndroid Build Coastguard Worker /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a 203*44844408SAndroid Build Coastguard Worker *human friendly way. 204*44844408SAndroid Build Coastguard Worker * 205*44844408SAndroid Build Coastguard Worker * The rules for line break and indent are as follow: 206*44844408SAndroid Build Coastguard Worker * - Object value: 207*44844408SAndroid Build Coastguard Worker * - if empty then print {} without indent and line break 208*44844408SAndroid Build Coastguard Worker * - if not empty the print '{', line break & indent, print one value per 209*44844408SAndroid Build Coastguard Worker *line 210*44844408SAndroid Build Coastguard Worker * and then unindent and line break and print '}'. 211*44844408SAndroid Build Coastguard Worker * - Array value: 212*44844408SAndroid Build Coastguard Worker * - if empty then print [] without indent and line break 213*44844408SAndroid Build Coastguard Worker * - if the array contains no object value, empty array or some other value 214*44844408SAndroid Build Coastguard Worker *types, 215*44844408SAndroid Build Coastguard Worker * and all the values fit on one lines, then print the array on a single 216*44844408SAndroid Build Coastguard Worker *line. 217*44844408SAndroid Build Coastguard Worker * - otherwise, it the values do not fit on one line, or the array contains 218*44844408SAndroid Build Coastguard Worker * object or non empty array, then print one value per line. 219*44844408SAndroid Build Coastguard Worker * 220*44844408SAndroid Build Coastguard Worker * If the Value have comments then they are outputed according to their 221*44844408SAndroid Build Coastguard Worker *#CommentPlacement. 222*44844408SAndroid Build Coastguard Worker * 223*44844408SAndroid Build Coastguard Worker * \sa Reader, Value, Value::setComment() 224*44844408SAndroid Build Coastguard Worker * \deprecated Use StreamWriterBuilder. 225*44844408SAndroid Build Coastguard Worker */ 226*44844408SAndroid Build Coastguard Worker #if defined(_MSC_VER) 227*44844408SAndroid Build Coastguard Worker #pragma warning(push) 228*44844408SAndroid Build Coastguard Worker #pragma warning(disable : 4996) // Deriving from deprecated class 229*44844408SAndroid Build Coastguard Worker #endif 230*44844408SAndroid Build Coastguard Worker class JSON_API 231*44844408SAndroid Build Coastguard Worker StyledWriter : public Writer { 232*44844408SAndroid Build Coastguard Worker public: 233*44844408SAndroid Build Coastguard Worker StyledWriter(); 234*44844408SAndroid Build Coastguard Worker ~StyledWriter() override = default; 235*44844408SAndroid Build Coastguard Worker 236*44844408SAndroid Build Coastguard Worker public: // overridden from Writer 237*44844408SAndroid Build Coastguard Worker /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format. 238*44844408SAndroid Build Coastguard Worker * \param root Value to serialize. 239*44844408SAndroid Build Coastguard Worker * \return String containing the JSON document that represents the root value. 240*44844408SAndroid Build Coastguard Worker */ 241*44844408SAndroid Build Coastguard Worker String write(const Value& root) override; 242*44844408SAndroid Build Coastguard Worker 243*44844408SAndroid Build Coastguard Worker private: 244*44844408SAndroid Build Coastguard Worker void writeValue(const Value& value); 245*44844408SAndroid Build Coastguard Worker void writeArrayValue(const Value& value); 246*44844408SAndroid Build Coastguard Worker bool isMultilineArray(const Value& value); 247*44844408SAndroid Build Coastguard Worker void pushValue(const String& value); 248*44844408SAndroid Build Coastguard Worker void writeIndent(); 249*44844408SAndroid Build Coastguard Worker void writeWithIndent(const String& value); 250*44844408SAndroid Build Coastguard Worker void indent(); 251*44844408SAndroid Build Coastguard Worker void unindent(); 252*44844408SAndroid Build Coastguard Worker void writeCommentBeforeValue(const Value& root); 253*44844408SAndroid Build Coastguard Worker void writeCommentAfterValueOnSameLine(const Value& root); 254*44844408SAndroid Build Coastguard Worker static bool hasCommentForValue(const Value& value); 255*44844408SAndroid Build Coastguard Worker static String normalizeEOL(const String& text); 256*44844408SAndroid Build Coastguard Worker 257*44844408SAndroid Build Coastguard Worker using ChildValues = std::vector<String>; 258*44844408SAndroid Build Coastguard Worker 259*44844408SAndroid Build Coastguard Worker ChildValues childValues_; 260*44844408SAndroid Build Coastguard Worker String document_; 261*44844408SAndroid Build Coastguard Worker String indentString_; 262*44844408SAndroid Build Coastguard Worker unsigned int rightMargin_{74}; 263*44844408SAndroid Build Coastguard Worker unsigned int indentSize_{3}; 264*44844408SAndroid Build Coastguard Worker bool addChildValues_{false}; 265*44844408SAndroid Build Coastguard Worker }; 266*44844408SAndroid Build Coastguard Worker #if defined(_MSC_VER) 267*44844408SAndroid Build Coastguard Worker #pragma warning(pop) 268*44844408SAndroid Build Coastguard Worker #endif 269*44844408SAndroid Build Coastguard Worker 270*44844408SAndroid Build Coastguard Worker /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a 271*44844408SAndroid Build Coastguard Worker human friendly way, 272*44844408SAndroid Build Coastguard Worker to a stream rather than to a string. 273*44844408SAndroid Build Coastguard Worker * 274*44844408SAndroid Build Coastguard Worker * The rules for line break and indent are as follow: 275*44844408SAndroid Build Coastguard Worker * - Object value: 276*44844408SAndroid Build Coastguard Worker * - if empty then print {} without indent and line break 277*44844408SAndroid Build Coastguard Worker * - if not empty the print '{', line break & indent, print one value per 278*44844408SAndroid Build Coastguard Worker line 279*44844408SAndroid Build Coastguard Worker * and then unindent and line break and print '}'. 280*44844408SAndroid Build Coastguard Worker * - Array value: 281*44844408SAndroid Build Coastguard Worker * - if empty then print [] without indent and line break 282*44844408SAndroid Build Coastguard Worker * - if the array contains no object value, empty array or some other value 283*44844408SAndroid Build Coastguard Worker types, 284*44844408SAndroid Build Coastguard Worker * and all the values fit on one lines, then print the array on a single 285*44844408SAndroid Build Coastguard Worker line. 286*44844408SAndroid Build Coastguard Worker * - otherwise, it the values do not fit on one line, or the array contains 287*44844408SAndroid Build Coastguard Worker * object or non empty array, then print one value per line. 288*44844408SAndroid Build Coastguard Worker * 289*44844408SAndroid Build Coastguard Worker * If the Value have comments then they are outputed according to their 290*44844408SAndroid Build Coastguard Worker #CommentPlacement. 291*44844408SAndroid Build Coastguard Worker * 292*44844408SAndroid Build Coastguard Worker * \sa Reader, Value, Value::setComment() 293*44844408SAndroid Build Coastguard Worker * \deprecated Use StreamWriterBuilder. 294*44844408SAndroid Build Coastguard Worker */ 295*44844408SAndroid Build Coastguard Worker #if defined(_MSC_VER) 296*44844408SAndroid Build Coastguard Worker #pragma warning(push) 297*44844408SAndroid Build Coastguard Worker #pragma warning(disable : 4996) // Deriving from deprecated class 298*44844408SAndroid Build Coastguard Worker #endif 299*44844408SAndroid Build Coastguard Worker class JSON_API 300*44844408SAndroid Build Coastguard Worker StyledStreamWriter { 301*44844408SAndroid Build Coastguard Worker public: 302*44844408SAndroid Build Coastguard Worker /** 303*44844408SAndroid Build Coastguard Worker * \param indentation Each level will be indented by this amount extra. 304*44844408SAndroid Build Coastguard Worker */ 305*44844408SAndroid Build Coastguard Worker StyledStreamWriter(String indentation = "\t"); 306*44844408SAndroid Build Coastguard Worker ~StyledStreamWriter() = default; 307*44844408SAndroid Build Coastguard Worker 308*44844408SAndroid Build Coastguard Worker public: 309*44844408SAndroid Build Coastguard Worker /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format. 310*44844408SAndroid Build Coastguard Worker * \param out Stream to write to. (Can be ostringstream, e.g.) 311*44844408SAndroid Build Coastguard Worker * \param root Value to serialize. 312*44844408SAndroid Build Coastguard Worker * \note There is no point in deriving from Writer, since write() should not 313*44844408SAndroid Build Coastguard Worker * return a value. 314*44844408SAndroid Build Coastguard Worker */ 315*44844408SAndroid Build Coastguard Worker void write(OStream& out, const Value& root); 316*44844408SAndroid Build Coastguard Worker 317*44844408SAndroid Build Coastguard Worker private: 318*44844408SAndroid Build Coastguard Worker void writeValue(const Value& value); 319*44844408SAndroid Build Coastguard Worker void writeArrayValue(const Value& value); 320*44844408SAndroid Build Coastguard Worker bool isMultilineArray(const Value& value); 321*44844408SAndroid Build Coastguard Worker void pushValue(const String& value); 322*44844408SAndroid Build Coastguard Worker void writeIndent(); 323*44844408SAndroid Build Coastguard Worker void writeWithIndent(const String& value); 324*44844408SAndroid Build Coastguard Worker void indent(); 325*44844408SAndroid Build Coastguard Worker void unindent(); 326*44844408SAndroid Build Coastguard Worker void writeCommentBeforeValue(const Value& root); 327*44844408SAndroid Build Coastguard Worker void writeCommentAfterValueOnSameLine(const Value& root); 328*44844408SAndroid Build Coastguard Worker static bool hasCommentForValue(const Value& value); 329*44844408SAndroid Build Coastguard Worker static String normalizeEOL(const String& text); 330*44844408SAndroid Build Coastguard Worker 331*44844408SAndroid Build Coastguard Worker using ChildValues = std::vector<String>; 332*44844408SAndroid Build Coastguard Worker 333*44844408SAndroid Build Coastguard Worker ChildValues childValues_; 334*44844408SAndroid Build Coastguard Worker OStream* document_; 335*44844408SAndroid Build Coastguard Worker String indentString_; 336*44844408SAndroid Build Coastguard Worker unsigned int rightMargin_{74}; 337*44844408SAndroid Build Coastguard Worker String indentation_; 338*44844408SAndroid Build Coastguard Worker bool addChildValues_ : 1; 339*44844408SAndroid Build Coastguard Worker bool indented_ : 1; 340*44844408SAndroid Build Coastguard Worker }; 341*44844408SAndroid Build Coastguard Worker #if defined(_MSC_VER) 342*44844408SAndroid Build Coastguard Worker #pragma warning(pop) 343*44844408SAndroid Build Coastguard Worker #endif 344*44844408SAndroid Build Coastguard Worker 345*44844408SAndroid Build Coastguard Worker #if defined(JSON_HAS_INT64) 346*44844408SAndroid Build Coastguard Worker String JSON_API valueToString(Int value); 347*44844408SAndroid Build Coastguard Worker String JSON_API valueToString(UInt value); 348*44844408SAndroid Build Coastguard Worker #endif // if defined(JSON_HAS_INT64) 349*44844408SAndroid Build Coastguard Worker String JSON_API valueToString(LargestInt value); 350*44844408SAndroid Build Coastguard Worker String JSON_API valueToString(LargestUInt value); 351*44844408SAndroid Build Coastguard Worker String JSON_API valueToString( 352*44844408SAndroid Build Coastguard Worker double value, unsigned int precision = Value::defaultRealPrecision, 353*44844408SAndroid Build Coastguard Worker PrecisionType precisionType = PrecisionType::significantDigits); 354*44844408SAndroid Build Coastguard Worker String JSON_API valueToString(bool value); 355*44844408SAndroid Build Coastguard Worker String JSON_API valueToQuotedString(const char* value); 356*44844408SAndroid Build Coastguard Worker 357*44844408SAndroid Build Coastguard Worker /// \brief Output using the StyledStreamWriter. 358*44844408SAndroid Build Coastguard Worker /// \see Json::operator>>() 359*44844408SAndroid Build Coastguard Worker JSON_API OStream& operator<<(OStream&, const Value& root); 360*44844408SAndroid Build Coastguard Worker 361*44844408SAndroid Build Coastguard Worker } // namespace Json 362*44844408SAndroid Build Coastguard Worker 363*44844408SAndroid Build Coastguard Worker #pragma pack(pop) 364*44844408SAndroid Build Coastguard Worker 365*44844408SAndroid Build Coastguard Worker #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) 366*44844408SAndroid Build Coastguard Worker #pragma warning(pop) 367*44844408SAndroid Build Coastguard Worker #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) 368*44844408SAndroid Build Coastguard Worker 369*44844408SAndroid Build Coastguard Worker #endif // JSON_WRITER_H_INCLUDED 370