rippled
Loading...
Searching...
No Matches
json_writer.h
1#ifndef XRPL_JSON_JSON_WRITER_H_INCLUDED
2#define XRPL_JSON_JSON_WRITER_H_INCLUDED
3
4#include <xrpl/json/json_forwards.h>
5#include <xrpl/json/json_value.h>
6
7#include <ostream>
8#include <vector>
9
10namespace Json {
11
12class Value;
13
17{
18public:
19 virtual ~WriterBase()
20 {
21 }
22 virtual std::string
23 write(Value const& root) = 0;
24};
25
34class FastWriter : public WriterBase
35{
36public:
37 FastWriter() = default;
38 virtual ~FastWriter()
39 {
40 }
41
42public: // overridden from Writer
44 write(Value const& root) override;
45
46private:
47 void
48 writeValue(Value const& value);
49
51};
52
72{
73public:
75 virtual ~StyledWriter()
76 {
77 }
78
79public: // overridden from Writer
85 write(Value const& root) override;
86
87private:
88 void
89 writeValue(Value const& value);
90 void
91 writeArrayValue(Value const& value);
92 bool
93 isMultineArray(Value const& value);
94 void
95 pushValue(std::string const& value);
96 void
98 void
99 writeWithIndent(std::string const& value);
100 void
101 indent();
102 void
103 unindent();
104
106
113};
114
137{
138public:
139 StyledStreamWriter(std::string indentation = "\t");
141 {
142 }
143
144public:
151 void
152 write(std::ostream& out, Value const& root);
153
154private:
155 void
156 writeValue(Value const& value);
157 void
158 writeArrayValue(Value const& value);
159 bool
160 isMultineArray(Value const& value);
161 void
162 pushValue(std::string const& value);
163 void
164 writeIndent();
165 void
166 writeWithIndent(std::string const& value);
167 void
168 indent();
169 void
170 unindent();
171
173
180};
181
183valueToString(Int value);
185valueToString(UInt value);
187valueToString(double value);
189valueToString(bool value);
191valueToQuotedString(char const* value);
192
196operator<<(std::ostream&, Value const& root);
197
198//------------------------------------------------------------------------------
199
200// Helpers for stream
201namespace detail {
202
203template <class Write>
204void
205write_string(Write const& write, std::string const& s)
206{
207 write(s.data(), s.size());
208}
209
210template <class Write>
211void
212write_value(Write const& write, Value const& value)
213{
214 switch (value.type())
215 {
216 case nullValue:
217 write("null", 4);
218 break;
219
220 case intValue:
221 write_string(write, valueToString(value.asInt()));
222 break;
223
224 case uintValue:
225 write_string(write, valueToString(value.asUInt()));
226 break;
227
228 case realValue:
229 write_string(write, valueToString(value.asDouble()));
230 break;
231
232 case stringValue:
234 break;
235
236 case booleanValue:
237 write_string(write, valueToString(value.asBool()));
238 break;
239
240 case arrayValue: {
241 write("[", 1);
242 int const size = value.size();
243 for (int index = 0; index < size; ++index)
244 {
245 if (index > 0)
246 write(",", 1);
247 write_value(write, value[index]);
248 }
249 write("]", 1);
250 break;
251 }
252
253 case objectValue: {
254 Value::Members const members = value.getMemberNames();
255 write("{", 1);
256 for (auto it = members.begin(); it != members.end(); ++it)
257 {
258 std::string const& name = *it;
259 if (it != members.begin())
260 write(",", 1);
261
262 write_string(write, valueToQuotedString(name.c_str()));
263 write(":", 1);
264 write_value(write, value[name]);
265 }
266 write("}", 1);
267 break;
268 }
269 }
270}
271
272} // namespace detail
273
280template <class Write>
281void
282stream(Json::Value const& jv, Write const& write)
283{
284 detail::write_value(write, jv);
285 write("\n", 1);
286}
287
299{
301
302public:
311 Compact(Json::Value&& jv) : jv_{std::move(jv)}
312 {
313 }
314
316 operator<<(std::ostream& o, Compact const& cJv)
317 {
319 [&o](void const* data, std::size_t n) {
320 o.write(static_cast<char const*>(data), n);
321 },
322 cJv.jv_);
323 return o;
324 }
325};
326
327} // namespace Json
328
329#endif // JSON_WRITER_H_INCLUDED
T begin(T... args)
T c_str(T... args)
Decorator for streaming out compact json.
Compact(Json::Value &&jv)
Wrap a Json::Value for compact streaming.
friend std::ostream & operator<<(std::ostream &o, Compact const &cJv)
Json::Value jv_
Outputs a Value in JSON format without formatting (not human friendly).
Definition json_writer.h:35
virtual ~FastWriter()
Definition json_writer.h:38
std::string write(Value const &root) override
void writeValue(Value const &value)
FastWriter()=default
std::string document_
Definition json_writer.h:50
Writes a Value in JSON format in a human friendly way, to a stream rather than to a string.
void write(std::ostream &out, Value const &root)
Serialize a Value in JSON format.
void writeWithIndent(std::string const &value)
bool isMultineArray(Value const &value)
void writeValue(Value const &value)
void writeArrayValue(Value const &value)
std::ostream * document_
void pushValue(std::string const &value)
Writes a Value in JSON format in a human friendly way.
Definition json_writer.h:72
ChildValues childValues_
std::string write(Value const &root) override
Serialize a Value in JSON format.
virtual ~StyledWriter()
Definition json_writer.h:75
std::string indentString_
void pushValue(std::string const &value)
void writeValue(Value const &value)
void writeArrayValue(Value const &value)
std::string document_
void writeWithIndent(std::string const &value)
bool isMultineArray(Value const &value)
Represents a JSON value.
Definition json_value.h:131
UInt size() const
Number of values in array or object.
char const * asCString() const
Int asInt() const
UInt asUInt() const
Members getMemberNames() const
Return a list of the member names.
ValueType type() const
bool asBool() const
double asDouble() const
Abstract class for writers.
Definition json_writer.h:17
virtual std::string write(Value const &root)=0
virtual ~WriterBase()
Definition json_writer.h:19
T data(T... args)
T end(T... args)
void write_string(Write const &write, std::string const &s)
void write_value(Write const &write, Value const &value)
JSON (JavaScript Object Notation).
Definition json_errors.h:6
void stream(Json::Value const &jv, Write const &write)
Stream compact JSON to the specified function.
std::string valueToString(Int value)
std::string valueToQuotedString(char const *value)
@ booleanValue
bool value
Definition json_value.h:25
@ nullValue
'null' value
Definition json_value.h:20
@ stringValue
UTF-8 string value.
Definition json_value.h:24
@ realValue
double value
Definition json_value.h:23
@ arrayValue
array value (ordered list)
Definition json_value.h:26
@ intValue
signed integer value
Definition json_value.h:21
@ objectValue
object value (collection of name/value pairs).
Definition json_value.h:27
@ uintValue
unsigned integer value
Definition json_value.h:22
int Int
unsigned int UInt
std::ostream & operator<<(std::ostream &, Value const &root)
Output using the StyledStreamWriter.
STL namespace.
T size(T... args)
T write(T... args)