rippled
Loading...
Searching...
No Matches
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 <xrpl/json/json_forwards.h>
24#include <xrpl/json/json_value.h>
25#include <ostream>
26#include <vector>
27
28namespace Json {
29
30class Value;
31
35{
36public:
37 virtual ~WriterBase()
38 {
39 }
40 virtual std::string
41 write(const Value& root) = 0;
42};
43
52class FastWriter : public WriterBase
53{
54public:
55 FastWriter() = default;
56 virtual ~FastWriter()
57 {
58 }
59
60public: // overridden from Writer
62 write(const Value& root) override;
63
64private:
65 void
66 writeValue(const Value& value);
67
69};
70
90{
91public:
93 virtual ~StyledWriter()
94 {
95 }
96
97public: // overridden from Writer
103 write(const Value& root) override;
104
105private:
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{
156public:
157 StyledStreamWriter(std::string indentation = "\t");
159 {
160 }
161
162public:
169 void
170 write(std::ostream& out, const Value& root);
171
172private:
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
201valueToString(Int value);
203valueToString(UInt value);
205valueToString(double value);
207valueToString(bool value);
209valueToQuotedString(const char* value);
210
214operator<<(std::ostream&, const Value& root);
215
216//------------------------------------------------------------------------------
217
218// Helpers for stream
219namespace detail {
220
221template <class Write>
222void
223write_string(Write const& write, std::string const& s)
224{
225 write(s.data(), s.size());
226}
227
228template <class Write>
229void
230write_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:
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
298template <class Write>
299void
300stream(Json::Value const& jv, Write const& write)
301{
302 detail::write_value(write, jv);
303 write("\n", 1);
304}
305
317{
319
320public:
329 Compact(Json::Value&& jv) : jv_{std::move(jv)}
330 {
331 }
332
334 operator<<(std::ostream& o, Compact const& cJv)
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
T begin(T... args)
T c_str(T... args)
Decorator for streaming out compact json.
Definition: json_writer.h:317
Compact(Json::Value &&jv)
Wrap a Json::Value for compact streaming.
Definition: json_writer.h:329
friend std::ostream & operator<<(std::ostream &o, Compact const &cJv)
Definition: json_writer.h:334
Json::Value jv_
Definition: json_writer.h:318
Outputs a Value in JSON format without formatting (not human friendly).
Definition: json_writer.h:53
void writeValue(const Value &value)
virtual ~FastWriter()
Definition: json_writer.h:56
std::string write(const Value &root) override
FastWriter()=default
std::string document_
Definition: json_writer.h:68
Writes a Value in JSON format in a human friendly way, to a stream rather than to a string.
Definition: json_writer.h:155
void write(std::ostream &out, const Value &root)
Serialize a Value in JSON format.
void writeValue(const Value &value)
void writeWithIndent(std::string const &value)
void writeArrayValue(const Value &value)
bool isMultineArray(const Value &value)
std::ostream * document_
Definition: json_writer.h:193
void pushValue(std::string const &value)
Writes a Value in JSON format in a human friendly way.
Definition: json_writer.h:90
void writeArrayValue(const Value &value)
ChildValues childValues_
Definition: json_writer.h:125
virtual ~StyledWriter()
Definition: json_writer.h:93
std::string indentString_
Definition: json_writer.h:127
void pushValue(std::string const &value)
bool isMultineArray(const Value &value)
std::string write(const Value &root) override
Serialize a Value in JSON format.
std::string document_
Definition: json_writer.h:126
void writeValue(const Value &value)
void writeWithIndent(std::string const &value)
Represents a JSON value.
Definition: json_value.h:147
const char * asCString() const
Definition: json_value.cpp:462
UInt size() const
Number of values in array or object.
Definition: json_value.cpp:706
Int asInt() const
Definition: json_value.cpp:503
UInt asUInt() const
Definition: json_value.cpp:545
Members getMemberNames() const
Return a list of the member names.
Definition: json_value.cpp:959
ValueType type() const
Definition: json_value.cpp:350
bool asBool() const
Definition: json_value.cpp:619
double asDouble() const
Definition: json_value.cpp:587
Abstract class for writers.
Definition: json_writer.h:35
virtual ~WriterBase()
Definition: json_writer.h:37
virtual std::string write(const Value &root)=0
T data(T... args)
T end(T... args)
void write_string(Write const &write, std::string const &s)
Definition: json_writer.h:223
void write_value(Write const &write, Value const &value)
Definition: json_writer.h:230
JSON (JavaScript Object Notation).
Definition: json_errors.h:25
void stream(Json::Value const &jv, Write const &write)
Stream compact JSON to the specified function.
Definition: json_writer.h:300
std::string valueToString(Int value)
Definition: json_writer.cpp:59
@ booleanValue
bool value
Definition: json_value.h:41
@ nullValue
'null' value
Definition: json_value.h:36
@ stringValue
UTF-8 string value.
Definition: json_value.h:40
@ realValue
double value
Definition: json_value.h:39
@ arrayValue
array value (ordered list)
Definition: json_value.h:42
@ intValue
signed integer value
Definition: json_value.h:37
@ objectValue
object value (collection of name/value pairs).
Definition: json_value.h:43
@ uintValue
unsigned integer value
Definition: json_value.h:38
std::ostream & operator<<(std::ostream &, const Value &root)
Output using the StyledStreamWriter.
int Int
Definition: json_forwards.h:26
std::string valueToQuotedString(const char *value)
unsigned int UInt
Definition: json_forwards.h:27
STL namespace.
T size(T... args)
T write(T... args)