xref: /aosp_15_r20/external/jsoncpp/include/json/writer.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_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