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