1
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
* JSON Library, originally from http://jsoncpp.sourceforge.net/
5
* Copyright (C) 2011 Stewart Smith
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions are
12
* * Redistributions of source code must retain the above copyright
13
* notice, this list of conditions and the following disclaimer.
15
* * Redistributions in binary form must reproduce the above
16
* copyright notice, this list of conditions and the following disclaimer
17
* in the documentation and/or other materials provided with the
20
* * The names of its contributors may not be used to endorse or
21
* promote products derived from this software without specific prior
24
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
49
/** \brief Abstract class for writers.
56
virtual std::string write( const Value &root ) = 0;
59
/** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format without formatting (not human friendly).
61
* The JSON document is written in a single line. It is not intended for 'human' consumption,
62
* but may be usefull to support feature such as RPC where bandwith is limited.
65
class JSON_API FastWriter : public Writer
70
void enableYAMLCompatibility();
72
public: // overridden from Writer
73
virtual std::string write( const Value &root );
76
void writeValue( const Value &value );
78
std::string document_;
79
bool yamlCompatiblityEnabled_;
82
/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way.
84
* The rules for line break and indent are as follow:
86
* - if empty then print {} without indent and line break
87
* - if not empty the print '{', line break & indent, print one value per line
88
* and then unindent and line break and print '}'.
90
* - if empty then print [] without indent and line break
91
* - if the array contains no object value, empty array or some other value types,
92
* and all the values fit on one lines, then print the array on a single line.
93
* - otherwise, it the values do not fit on one line, or the array contains
94
* object or non empty array, then print one value per line.
96
* If the Value have comments then they are outputed according to their #CommentPlacement.
98
* \sa Reader, Value, Value::setComment()
100
class JSON_API StyledWriter: public Writer
105
public: // overridden from Writer
106
/** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
107
* \param root Value to serialize.
108
* \return String containing the JSON document that represents the root value.
110
virtual std::string write( const Value &root );
113
void writeValue( const Value &value );
114
void writeArrayValue( const Value &value );
115
bool isMultineArray( const Value &value );
116
void pushValue( const std::string &value );
118
void writeWithIndent( const std::string &value );
121
void writeCommentBeforeValue( const Value &root );
122
void writeCommentAfterValueOnSameLine( const Value &root );
123
bool hasCommentForValue( const Value &value );
124
static std::string normalizeEOL( const std::string &text );
126
typedef std::vector<std::string> ChildValues;
128
ChildValues childValues_;
129
std::string document_;
130
std::string indentString_;
133
bool addChildValues_;
136
/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way,
137
to a stream rather than to a string.
139
* The rules for line break and indent are as follow:
141
* - if empty then print {} without indent and line break
142
* - if not empty the print '{', line break & indent, print one value per line
143
* and then unindent and line break and print '}'.
145
* - if empty then print [] without indent and line break
146
* - if the array contains no object value, empty array or some other value types,
147
* and all the values fit on one lines, then print the array on a single line.
148
* - otherwise, it the values do not fit on one line, or the array contains
149
* object or non empty array, then print one value per line.
151
* If the Value have comments then they are outputed according to their #CommentPlacement.
153
* \param indentation Each level will be indented by this amount extra.
154
* \sa Reader, Value, Value::setComment()
156
class JSON_API StyledStreamWriter
159
StyledStreamWriter( std::string indentation="\t" );
160
~StyledStreamWriter(){}
163
/** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
164
* \param out Stream to write to. (Can be ostringstream, e.g.)
165
* \param root Value to serialize.
166
* \note There is no point in deriving from Writer, since write() should not return a value.
168
void write( std::ostream &out, const Value &root );
171
void writeValue( const Value &value );
172
void writeArrayValue( const Value &value );
173
bool isMultineArray( const Value &value );
174
void pushValue( const std::string &value );
176
void writeWithIndent( const std::string &value );
179
void writeCommentBeforeValue( const Value &root );
180
void writeCommentAfterValueOnSameLine( const Value &root );
181
bool hasCommentForValue( const Value &value );
182
static std::string normalizeEOL( const std::string &text );
184
typedef std::vector<std::string> ChildValues;
186
ChildValues childValues_;
187
std::ostream* document_;
188
std::string indentString_;
190
std::string indentation_;
191
bool addChildValues_;
194
std::string JSON_API valueToString( Int value );
195
std::string JSON_API valueToString( UInt value );
196
std::string JSON_API valueToString( double value );
197
std::string JSON_API valueToString( bool value );
198
std::string JSON_API valueToQuotedString( const char *value );
200
/// \brief Output using the StyledStreamWriter.
201
/// \see Json::operator>>()
202
std::ostream& operator<<( std::ostream&, const Value &root );