JsonCpp project page Classes Namespace JsonCpp home page

writer.h
Go to the documentation of this file.
1 // Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
2 // Distributed under MIT license, or public domain if desired and
3 // recognized in your jurisdiction.
4 // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
5 
6 #ifndef JSON_WRITER_H_INCLUDED
7 #define JSON_WRITER_H_INCLUDED
8 
9 #if !defined(JSON_IS_AMALGAMATION)
10 #include "value.h"
11 #endif // if !defined(JSON_IS_AMALGAMATION)
12 #include <ostream>
13 #include <string>
14 #include <vector>
15 
16 // Disable warning C4251: <data member>: <type> needs to have dll-interface to
17 // be used by...
18 #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) && defined(_MSC_VER)
19 #pragma warning(push)
20 #pragma warning(disable : 4251)
21 #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
22 
23 #pragma pack(push)
24 #pragma pack()
25 
26 namespace Json {
27 
28 class Value;
29 
43 protected:
44  OStream* sout_; // not owned; will not delete
45 public:
46  StreamWriter();
47  virtual ~StreamWriter();
55  virtual int write(Value const& root, OStream* sout) = 0;
56 
59  class JSON_API Factory {
60  public:
61  virtual ~Factory();
65  virtual StreamWriter* newStreamWriter() const = 0;
66  }; // Factory
67 }; // StreamWriter
68 
73  Value const& root);
74 
91 public:
92  // Note: We use a Json::Value so that we can add data-members to this class
93  // without a major version bump.
123 
126 
130  StreamWriter* newStreamWriter() const override;
131 
135  bool validate(Json::Value* invalid) const;
138  Value& operator[](const String& key);
139 
145  static void setDefaults(Json::Value* settings);
146 };
147 
152 public:
153  virtual ~Writer();
154 
155  virtual String write(const Value& root) = 0;
156 };
157 
167 #if defined(_MSC_VER)
168 #pragma warning(push)
169 #pragma warning(disable : 4996) // Deriving from deprecated class
170 #endif
171 class JSON_API FastWriter : public Writer {
172 public:
174  ~FastWriter() override = default;
175 
176  void enableYAMLCompatibility();
177 
183  void dropNullPlaceholders();
184 
185  void omitEndingLineFeed();
186 
187 public: // overridden from Writer
188  String write(const Value& root) override;
189 
190 private:
191  void writeValue(const Value& value);
192 
193  String document_;
194  bool yamlCompatibilityEnabled_{false};
195  bool dropNullPlaceholders_{false};
196  bool omitEndingLineFeed_{false};
197 };
198 #if defined(_MSC_VER)
199 #pragma warning(pop)
200 #endif
201 
226 #if defined(_MSC_VER)
227 #pragma warning(push)
228 #pragma warning(disable : 4996) // Deriving from deprecated class
229 #endif
230 class JSON_API StyledWriter : public Writer {
231 public:
233  ~StyledWriter() override = default;
234 
235 public: // overridden from Writer
240  String write(const Value& root) override;
241 
242 private:
243  void writeValue(const Value& value);
244  void writeArrayValue(const Value& value);
245  bool isMultilineArray(const Value& value);
246  void pushValue(const String& value);
247  void writeIndent();
248  void writeWithIndent(const String& value);
249  void indent();
250  void unindent();
251  void writeCommentBeforeValue(const Value& root);
252  void writeCommentAfterValueOnSameLine(const Value& root);
253  static bool hasCommentForValue(const Value& value);
254  static String normalizeEOL(const String& text);
255 
256  using ChildValues = std::vector<String>;
257 
258  ChildValues childValues_;
259  String document_;
260  String indentString_;
261  unsigned int rightMargin_{74};
262  unsigned int indentSize_{3};
263  bool addChildValues_{false};
264 };
265 #if defined(_MSC_VER)
266 #pragma warning(pop)
267 #endif
268 
294 #if defined(_MSC_VER)
295 #pragma warning(push)
296 #pragma warning(disable : 4996) // Deriving from deprecated class
297 #endif
299 public:
303  StyledStreamWriter(String indentation = "\t");
304  ~StyledStreamWriter() = default;
305 
306 public:
313  void write(OStream& out, const Value& root);
314 
315 private:
316  void writeValue(const Value& value);
317  void writeArrayValue(const Value& value);
318  bool isMultilineArray(const Value& value);
319  void pushValue(const String& value);
320  void writeIndent();
321  void writeWithIndent(const String& value);
322  void indent();
323  void unindent();
324  void writeCommentBeforeValue(const Value& root);
325  void writeCommentAfterValueOnSameLine(const Value& root);
326  static bool hasCommentForValue(const Value& value);
327  static String normalizeEOL(const String& text);
328 
329  using ChildValues = std::vector<String>;
330 
331  ChildValues childValues_;
332  OStream* document_;
333  String indentString_;
334  unsigned int rightMargin_{74};
335  String indentation_;
336  bool addChildValues_ : 1;
337  bool indented_ : 1;
338 };
339 #if defined(_MSC_VER)
340 #pragma warning(pop)
341 #endif
342 
343 #if defined(JSON_HAS_INT64)
346 #endif // if defined(JSON_HAS_INT64)
350  double value, unsigned int precision = Value::defaultRealPrecision,
352 String JSON_API valueToString(bool value);
353 String JSON_API valueToQuotedString(const char* value);
354 String JSON_API valueToQuotedString(const char* value, size_t length);
355 
358 JSON_API OStream& operator<<(OStream&, const Value& root);
359 
360 } // namespace Json
361 
362 #pragma pack(pop)
363 
364 #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
365 #pragma warning(pop)
366 #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
367 
368 #endif // JSON_WRITER_H_INCLUDED
Outputs a Value in JSON format without formatting (not human friendly).
Definition: writer.h:171
~FastWriter() override=default
A simple abstract factory.
Definition: writer.h:59
virtual StreamWriter * newStreamWriter() const =0
Allocate a CharReader via operator new().
Build a StreamWriter implementation.
Definition: writer.h:90
Json::Value settings_
Configuration of this builder.
Definition: writer.h:122
virtual ~StreamWriter()
virtual int write(Value const &root, OStream *sout)=0
Write Value into document as configured in sub-class.
OStream * sout_
Definition: writer.h:44
Writes a Value in JSON format in a human friendly way, to a stream rather than to a string.
Definition: writer.h:298
Writes a Value in JSON format in a human friendly way.
Definition: writer.h:230
~StyledWriter() override=default
Represents a JSON value.
Definition: value.h:194
static constexpr UInt defaultRealPrecision
Default precision for real value for string representation.
Definition: value.h:247
Abstract class for writers.
Definition: writer.h:151
virtual ~Writer()
virtual String write(const Value &root)=0
#define JSON_API
If defined, indicates that the source file is amalgamated to prevent private header inclusion.
Definition: config.h:50
JSON (JavaScript Object Notation).
Definition: allocator.h:15
std::ostream OStream
Definition: config.h:140
std::basic_string< char, std::char_traits< char >, Allocator< char > > String
Definition: config.h:132
String writeString(StreamWriter::Factory const &factory, Value const &root)
Write into stringstream, then return string, for convenience.
Int64 LargestInt
Definition: config.h:123
String valueToQuotedString(const char *value)
String valueToString(Int value)
OStream & operator<<(OStream &, const Value &root)
Output using the StyledStreamWriter.
int Int
Definition: config.h:108
UInt64 LargestUInt
Definition: config.h:124
unsigned int UInt
Definition: config.h:109
PrecisionType
Type of precision for formatting of real values.
Definition: value.h:129
@ significantDigits
we set max number of significant digits in string
Definition: value.h:130