blob: cb0bd9b0b3660ce7ca41063f478d13e37089e6a4 [file] [log] [blame]
Baptiste Lepilleur7469f1d2010-04-20 21:35:19 +00001// Copyright 2007-2010 Baptiste Lepilleur
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
Christopher Dunn6d135cb2007-06-13 15:51:04 +00006#ifndef JSON_WRITER_H_INCLUDED
7# define JSON_WRITER_H_INCLUDED
8
Baptiste Lepilleur64e40aa2011-05-01 20:13:40 +00009#if !defined(JSON_IS_AMALGATED)
Christopher Dunn6d135cb2007-06-13 15:51:04 +000010# include "value.h"
Baptiste Lepilleur64e40aa2011-05-01 20:13:40 +000011#endif // if !defined(JSON_IS_AMALGATED)
Christopher Dunn6d135cb2007-06-13 15:51:04 +000012# include <vector>
13# include <string>
14# include <iostream>
15
16namespace Json {
17
18 class Value;
19
20 /** \brief Abstract class for writers.
21 */
22 class JSON_API Writer
23 {
24 public:
25 virtual ~Writer();
26
27 virtual std::string write( const Value &root ) = 0;
28 };
29
30 /** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format without formatting (not human friendly).
31 *
32 * The JSON document is written in a single line. It is not intended for 'human' consumption,
33 * but may be usefull to support feature such as RPC where bandwith is limited.
34 * \sa Reader, Value
35 */
36 class JSON_API FastWriter : public Writer
37 {
38 public:
39 FastWriter();
Christopher Dunn605cd7e2007-06-13 15:55:50 +000040 virtual ~FastWriter(){}
Christopher Dunn6d135cb2007-06-13 15:51:04 +000041
42 void enableYAMLCompatibility();
43
44 public: // overridden from Writer
45 virtual std::string write( const Value &root );
46
47 private:
48 void writeValue( const Value &value );
49
50 std::string document_;
51 bool yamlCompatiblityEnabled_;
52 };
53
54 /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way.
55 *
56 * The rules for line break and indent are as follow:
57 * - Object value:
58 * - if empty then print {} without indent and line break
59 * - if not empty the print '{', line break & indent, print one value per line
60 * and then unindent and line break and print '}'.
61 * - Array value:
62 * - if empty then print [] without indent and line break
63 * - if the array contains no object value, empty array or some other value types,
64 * and all the values fit on one lines, then print the array on a single line.
65 * - otherwise, it the values do not fit on one line, or the array contains
66 * object or non empty array, then print one value per line.
67 *
68 * If the Value have comments then they are outputed according to their #CommentPlacement.
69 *
70 * \sa Reader, Value, Value::setComment()
71 */
Christopher Dunn605cd7e2007-06-13 15:55:50 +000072 class JSON_API StyledWriter: public Writer
Christopher Dunn6d135cb2007-06-13 15:51:04 +000073 {
74 public:
75 StyledWriter();
76 virtual ~StyledWriter(){}
77
78 public: // overridden from Writer
79 /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
80 * \param root Value to serialize.
81 * \return String containing the JSON document that represents the root value.
82 */
83 virtual std::string write( const Value &root );
84
85 private:
86 void writeValue( const Value &value );
87 void writeArrayValue( const Value &value );
88 bool isMultineArray( const Value &value );
89 void pushValue( const std::string &value );
90 void writeIndent();
91 void writeWithIndent( const std::string &value );
92 void indent();
93 void unindent();
94 void writeCommentBeforeValue( const Value &root );
95 void writeCommentAfterValueOnSameLine( const Value &root );
96 bool hasCommentForValue( const Value &value );
97 static std::string normalizeEOL( const std::string &text );
98
99 typedef std::vector<std::string> ChildValues;
100
101 ChildValues childValues_;
102 std::string document_;
103 std::string indentString_;
104 int rightMargin_;
105 int indentSize_;
106 bool addChildValues_;
107 };
108
Christopher Dunn605cd7e2007-06-13 15:55:50 +0000109 /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way,
110 to a stream rather than to a string.
111 *
112 * The rules for line break and indent are as follow:
113 * - Object value:
114 * - if empty then print {} without indent and line break
115 * - if not empty the print '{', line break & indent, print one value per line
116 * and then unindent and line break and print '}'.
117 * - Array value:
118 * - if empty then print [] without indent and line break
119 * - if the array contains no object value, empty array or some other value types,
120 * and all the values fit on one lines, then print the array on a single line.
121 * - otherwise, it the values do not fit on one line, or the array contains
122 * object or non empty array, then print one value per line.
123 *
124 * If the Value have comments then they are outputed according to their #CommentPlacement.
125 *
126 * \param indentation Each level will be indented by this amount extra.
127 * \sa Reader, Value, Value::setComment()
128 */
129 class JSON_API StyledStreamWriter
130 {
131 public:
132 StyledStreamWriter( std::string indentation="\t" );
133 ~StyledStreamWriter(){}
134
135 public:
136 /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
137 * \param out Stream to write to. (Can be ostringstream, e.g.)
138 * \param root Value to serialize.
139 * \note There is no point in deriving from Writer, since write() should not return a value.
140 */
141 void write( std::ostream &out, const Value &root );
142
143 private:
144 void writeValue( const Value &value );
145 void writeArrayValue( const Value &value );
146 bool isMultineArray( const Value &value );
147 void pushValue( const std::string &value );
148 void writeIndent();
149 void writeWithIndent( const std::string &value );
150 void indent();
151 void unindent();
152 void writeCommentBeforeValue( const Value &root );
153 void writeCommentAfterValueOnSameLine( const Value &root );
154 bool hasCommentForValue( const Value &value );
155 static std::string normalizeEOL( const std::string &text );
156
157 typedef std::vector<std::string> ChildValues;
158
159 ChildValues childValues_;
160 std::ostream* document_;
161 std::string indentString_;
162 int rightMargin_;
163 std::string indentation_;
164 bool addChildValues_;
165 };
166
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +0000167# if defined(JSON_HAS_INT64)
Baptiste Lepilleur3a1b93b2010-02-21 14:08:17 +0000168 std::string JSON_API valueToString( Int value );
169 std::string JSON_API valueToString( UInt value );
Baptiste Lepilleur842e9ac2010-12-27 17:45:23 +0000170# endif // if defined(JSON_HAS_INT64)
171 std::string JSON_API valueToString( LargestInt value );
172 std::string JSON_API valueToString( LargestUInt value );
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000173 std::string JSON_API valueToString( double value );
174 std::string JSON_API valueToString( bool value );
175 std::string JSON_API valueToQuotedString( const char *value );
176
Christopher Dunn605cd7e2007-06-13 15:55:50 +0000177 /// \brief Output using the StyledStreamWriter.
Christopher Dunn6d135cb2007-06-13 15:51:04 +0000178 /// \see Json::operator>>()
179 std::ostream& operator<<( std::ostream&, const Value &root );
180
181} // namespace Json
182
183
184
185#endif // JSON_WRITER_H_INCLUDED