rippled
json_writer.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_JSON_JSON_WRITER_H_INCLUDED
21 #define RIPPLE_JSON_JSON_WRITER_H_INCLUDED
22 
23 #include <ripple/json/json_forwards.h>
24 #include <ripple/json/json_value.h>
25 #include <ostream>
26 #include <vector>
27 
28 namespace Json {
29 
30 class Value;
31 
35 {
36 public:
37  virtual ~WriterBase()
38  {
39  }
40  virtual std::string
41  write(const Value& root) = 0;
42 };
43 
52 class FastWriter : public WriterBase
53 {
54 public:
55  FastWriter() = default;
56  virtual ~FastWriter()
57  {
58  }
59 
60 public: // overridden from Writer
62  write(const Value& root) override;
63 
64 private:
65  void
66  writeValue(const Value& value);
67 
69 };
70 
89 class StyledWriter : public WriterBase
90 {
91 public:
92  StyledWriter();
93  virtual ~StyledWriter()
94  {
95  }
96 
97 public: // overridden from Writer
103  write(const Value& root) override;
104 
105 private:
106  void
107  writeValue(const Value& value);
108  void
109  writeArrayValue(const Value& value);
110  bool
111  isMultineArray(const Value& value);
112  void
113  pushValue(std::string const& value);
114  void
115  writeIndent();
116  void
117  writeWithIndent(std::string const& value);
118  void
119  indent();
120  void
121  unindent();
122 
124 
131 };
132 
155 {
156 public:
157  StyledStreamWriter(std::string indentation = "\t");
159  {
160  }
161 
162 public:
169  void
170  write(std::ostream& out, const Value& root);
171 
172 private:
173  void
174  writeValue(const Value& value);
175  void
176  writeArrayValue(const Value& value);
177  bool
178  isMultineArray(const Value& value);
179  void
180  pushValue(std::string const& value);
181  void
182  writeIndent();
183  void
184  writeWithIndent(std::string const& value);
185  void
186  indent();
187  void
188  unindent();
189 
191 
198 };
199 
201 valueToString(Int value);
203 valueToString(UInt value);
205 valueToString(double value);
207 valueToString(bool value);
209 valueToQuotedString(const char* value);
210 
214 operator<<(std::ostream&, const Value& root);
215 
216 //------------------------------------------------------------------------------
217 
218 // Helpers for stream
219 namespace detail {
220 
221 template <class Write>
222 void
223 write_string(Write const& write, std::string const& s)
224 {
225  write(s.data(), s.size());
226 }
227 
228 template <class Write>
229 void
230 write_value(Write const& write, Value const& value)
231 {
232  switch (value.type())
233  {
234  case nullValue:
235  write("null", 4);
236  break;
237 
238  case intValue:
239  write_string(write, valueToString(value.asInt()));
240  break;
241 
242  case uintValue:
243  write_string(write, valueToString(value.asUInt()));
244  break;
245 
246  case realValue:
247  write_string(write, valueToString(value.asDouble()));
248  break;
249 
250  case stringValue:
251  write_string(write, valueToQuotedString(value.asCString()));
252  break;
253 
254  case booleanValue:
255  write_string(write, valueToString(value.asBool()));
256  break;
257 
258  case arrayValue: {
259  write("[", 1);
260  int const size = value.size();
261  for (int index = 0; index < size; ++index)
262  {
263  if (index > 0)
264  write(",", 1);
265  write_value(write, value[index]);
266  }
267  write("]", 1);
268  break;
269  }
270 
271  case objectValue: {
272  Value::Members const members = value.getMemberNames();
273  write("{", 1);
274  for (auto it = members.begin(); it != members.end(); ++it)
275  {
276  std::string const& name = *it;
277  if (it != members.begin())
278  write(",", 1);
279 
280  write_string(write, valueToQuotedString(name.c_str()));
281  write(":", 1);
282  write_value(write, value[name]);
283  }
284  write("}", 1);
285  break;
286  }
287  }
288 }
289 
290 } // namespace detail
291 
298 template <class Write>
299 void
300 stream(Json::Value const& jv, Write const& write)
301 {
302  detail::write_value(write, jv);
303  write("\n", 1);
304 }
305 
316 class Compact
317 {
319 
320 public:
329  Compact(Json::Value&& jv) : jv_{std::move(jv)}
330  {
331  }
332 
333  friend std::ostream&
335  {
337  [&o](void const* data, std::size_t n) {
338  o.write(static_cast<char const*>(data), n);
339  },
340  cJv.jv_);
341  return o;
342  }
343 };
344 
345 } // namespace Json
346 
347 #endif // JSON_WRITER_H_INCLUDED
Json::WriterBase
Abstract class for writers.
Definition: json_writer.h:34
std::string
STL class.
Json::Compact::jv_
Json::Value jv_
Definition: json_writer.h:318
Json::detail::write_value
void write_value(Write const &write, Value const &value)
Definition: json_writer.h:230
Json::stream
void stream(Json::Value const &jv, Write const &write)
Stream compact JSON to the specified function.
Definition: json_writer.h:300
Json::arrayValue
@ arrayValue
array value (ordered list)
Definition: json_value.h:42
Json::StyledStreamWriter::StyledStreamWriter
StyledStreamWriter(std::string indentation="\t")
Definition: json_writer.cpp:493
Json::booleanValue
@ booleanValue
bool value
Definition: json_value.h:41
Json::UInt
unsigned int UInt
Definition: json_forwards.h:27
Json::Compact
Decorator for streaming out compact json.
Definition: json_writer.h:316
Json::StyledStreamWriter::isMultineArray
bool isMultineArray(const Value &value)
Definition: json_writer.cpp:633
vector
std::string::size
T size(T... args)
Json::StyledWriter::pushValue
void pushValue(std::string const &value)
Definition: json_writer.cpp:445
Json::Compact::Compact
Compact(Json::Value &&jv)
Wrap a Json::Value for compact streaming.
Definition: json_writer.h:329
Json::realValue
@ realValue
double value
Definition: json_value.h:39
Json::valueToString
std::string valueToString(Int value)
Definition: json_writer.cpp:59
Json::StyledWriter::writeValue
void writeValue(const Value &value)
Definition: json_writer.cpp:288
Json::FastWriter::FastWriter
FastWriter()=default
Json::StyledStreamWriter::pushValue
void pushValue(std::string const &value)
Definition: json_writer.cpp:667
Json::StyledWriter::write
std::string write(const Value &root) override
Serialize a Value in JSON format.
Definition: json_writer.cpp:277
Json::StyledWriter::indentString_
std::string indentString_
Definition: json_writer.h:127
std::ostream::write
T write(T... args)
Json::StyledStreamWriter::rightMargin_
int rightMargin_
Definition: json_writer.h:195
Json::StyledWriter::indentSize_
int indentSize_
Definition: json_writer.h:129
Json::StyledWriter::writeArrayValue
void writeArrayValue(const Value &value)
Definition: json_writer.cpp:354
Json::operator<<
std::ostream & operator<<(std::ostream &sout, const Value &root)
Output using the StyledStreamWriter.
Definition: json_writer.cpp:714
Json::Value::asBool
bool asBool() const
Definition: json_value.cpp:619
Json::StyledWriter::document_
std::string document_
Definition: json_writer.h:126
Json::StyledStreamWriter::writeArrayValue
void writeArrayValue(const Value &value)
Definition: json_writer.cpp:576
Json::uintValue
@ uintValue
unsigned integer value
Definition: json_value.h:38
Json::StyledWriter::StyledWriter
StyledWriter()
Definition: json_writer.cpp:272
Json::StyledStreamWriter::document_
std::ostream * document_
Definition: json_writer.h:193
Json::StyledStreamWriter::write
void write(std::ostream &out, const Value &root)
Serialize a Value in JSON format.
Definition: json_writer.cpp:499
Json
JSON (JavaScript Object Notation).
Definition: json_reader.cpp:27
Json::objectValue
@ objectValue
object value (collection of name/value pairs).
Definition: json_value.h:43
Json::Compact::operator<<
friend std::ostream & operator<<(std::ostream &o, Compact const &cJv)
Definition: json_writer.h:334
std::ostream
STL class.
Json::StyledWriter
Writes a Value in JSON format in a human friendly way.
Definition: json_writer.h:89
std::string::c_str
T c_str(T... args)
Json::StyledWriter::isMultineArray
bool isMultineArray(const Value &value)
Definition: json_writer.cpp:411
Json::StyledStreamWriter::indent
void indent()
Definition: json_writer.cpp:701
Json::StyledStreamWriter
Writes a Value in JSON format in a human friendly way, to a stream rather than to a string.
Definition: json_writer.h:154
Json::StyledStreamWriter::~StyledStreamWriter
~StyledStreamWriter()
Definition: json_writer.h:158
Json::StyledWriter::indent
void indent()
Definition: json_writer.cpp:478
Json::Value::size
UInt size() const
Number of values in array or object.
Definition: json_value.cpp:706
Json::stringValue
@ stringValue
UTF-8 string value.
Definition: json_value.h:40
Json::Value::asCString
const char * asCString() const
Definition: json_value.cpp:462
Json::StyledWriter::writeIndent
void writeIndent()
Definition: json_writer.cpp:454
Json::detail::write_string
void write_string(Write const &write, std::string const &s)
Definition: json_writer.h:223
Json::FastWriter::write
std::string write(const Value &root) override
Definition: json_writer.cpp:193
Json::Int
int Int
Definition: json_forwards.h:26
Json::StyledStreamWriter::writeWithIndent
void writeWithIndent(std::string const &value)
Definition: json_writer.cpp:694
Json::StyledStreamWriter::writeIndent
void writeIndent()
Definition: json_writer.cpp:676
Json::Value::getMemberNames
Members getMemberNames() const
Return a list of the member names.
Definition: json_value.cpp:948
Json::StyledStreamWriter::unindent
void unindent()
Definition: json_writer.cpp:707
std::vector::begin
T begin(T... args)
Json::StyledWriter::~StyledWriter
virtual ~StyledWriter()
Definition: json_writer.h:93
Json::intValue
@ intValue
signed integer value
Definition: json_value.h:37
Json::StyledWriter::addChildValues_
bool addChildValues_
Definition: json_writer.h:130
Json::Value::asUInt
UInt asUInt() const
Definition: json_value.cpp:545
Json::FastWriter::~FastWriter
virtual ~FastWriter()
Definition: json_writer.h:56
Json::FastWriter
Outputs a Value in JSON format without formatting (not human friendly).
Definition: json_writer.h:52
Json::nullValue
@ nullValue
'null' value
Definition: json_value.h:36
Json::StyledWriter::unindent
void unindent()
Definition: json_writer.cpp:484
Json::StyledStreamWriter::writeValue
void writeValue(const Value &value)
Definition: json_writer.cpp:510
Json::valueToQuotedString
std::string valueToQuotedString(const char *value)
Definition: json_writer.cpp:113
Json::WriterBase::write
virtual std::string write(const Value &root)=0
std::size_t
Json::Value::asInt
Int asInt() const
Definition: json_value.cpp:503
Json::StyledWriter::rightMargin_
int rightMargin_
Definition: json_writer.h:128
std::vector::end
T end(T... args)
Json::WriterBase::~WriterBase
virtual ~WriterBase()
Definition: json_writer.h:37
Json::StyledStreamWriter::addChildValues_
bool addChildValues_
Definition: json_writer.h:197
ostream
Json::StyledStreamWriter::indentation_
std::string indentation_
Definition: json_writer.h:196
Json::Value::asDouble
double asDouble() const
Definition: json_value.cpp:587
Json::FastWriter::writeValue
void writeValue(const Value &value)
Definition: json_writer.cpp:201
Json::Value::type
ValueType type() const
Definition: json_value.cpp:350
Json::StyledStreamWriter::childValues_
ChildValues childValues_
Definition: json_writer.h:192
Json::StyledWriter::writeWithIndent
void writeWithIndent(std::string const &value)
Definition: json_writer.cpp:471
std::string::data
T data(T... args)
Json::StyledStreamWriter::indentString_
std::string indentString_
Definition: json_writer.h:194
Json::StyledWriter::childValues_
ChildValues childValues_
Definition: json_writer.h:125
Json::Value
Represents a JSON value.
Definition: json_value.h:145
Json::FastWriter::document_
std::string document_
Definition: json_writer.h:68