rippled
Loading...
Searching...
No Matches
json_writer.h
1#pragma once
2
3#include <xrpl/json/json_forwards.h>
4#include <xrpl/json/json_value.h>
5
6#include <ostream>
7#include <vector>
8
9namespace Json {
10
11class Value;
12
16{
17public:
18 virtual ~WriterBase()
19 {
20 }
21 virtual std::string
22 write(Value const& root) = 0;
23};
24
33class FastWriter : public WriterBase
34{
35public:
36 FastWriter() = default;
37 virtual ~FastWriter()
38 {
39 }
40
41public: // overridden from Writer
43 write(Value const& root) override;
44
45private:
46 void
47 writeValue(Value const& value);
48
50};
51
71{
72public:
74 virtual ~StyledWriter()
75 {
76 }
77
78public: // overridden from Writer
84 write(Value const& root) override;
85
86private:
87 void
88 writeValue(Value const& value);
89 void
90 writeArrayValue(Value const& value);
91 bool
92 isMultilineArray(Value const& value);
93 void
94 pushValue(std::string const& value);
95 void
97 void
98 writeWithIndent(std::string const& value);
99 void
100 indent();
101 void
102 unindent();
103
105
112};
113
136{
137public:
138 StyledStreamWriter(std::string indentation = "\t");
140 {
141 }
142
143public:
150 void
151 write(std::ostream& out, Value const& root);
152
153private:
154 void
155 writeValue(Value const& value);
156 void
157 writeArrayValue(Value const& value);
158 bool
159 isMultilineArray(Value const& value);
160 void
161 pushValue(std::string const& value);
162 void
163 writeIndent();
164 void
165 writeWithIndent(std::string const& value);
166 void
167 indent();
168 void
169 unindent();
170
172
179};
180
182valueToString(Int value);
184valueToString(UInt value);
186valueToString(double value);
188valueToString(bool value);
190valueToQuotedString(char const* value);
191
195operator<<(std::ostream&, Value const& root);
196
197//------------------------------------------------------------------------------
198
199// Helpers for stream
200namespace detail {
201
202template <class Write>
203void
204write_string(Write const& write, std::string const& s)
205{
206 write(s.data(), s.size());
207}
208
209template <class Write>
210void
211write_value(Write const& write, Value const& value)
212{
213 switch (value.type())
214 {
215 case nullValue:
216 write("null", 4);
217 break;
218
219 case intValue:
220 write_string(write, valueToString(value.asInt()));
221 break;
222
223 case uintValue:
224 write_string(write, valueToString(value.asUInt()));
225 break;
226
227 case realValue:
228 write_string(write, valueToString(value.asDouble()));
229 break;
230
231 case stringValue:
233 break;
234
235 case booleanValue:
236 write_string(write, valueToString(value.asBool()));
237 break;
238
239 case arrayValue: {
240 write("[", 1);
241 int const size = value.size();
242 for (int index = 0; index < size; ++index)
243 {
244 if (index > 0)
245 write(",", 1);
246 write_value(write, value[index]);
247 }
248 write("]", 1);
249 break;
250 }
251
252 case objectValue: {
253 Value::Members const members = value.getMemberNames();
254 write("{", 1);
255 for (auto it = members.begin(); it != members.end(); ++it)
256 {
257 std::string const& name = *it;
258 if (it != members.begin())
259 write(",", 1);
260
261 write_string(write, valueToQuotedString(name.c_str()));
262 write(":", 1);
263 write_value(write, value[name]);
264 }
265 write("}", 1);
266 break;
267 }
268 }
269}
270
271} // namespace detail
272
279template <class Write>
280void
281stream(Json::Value const& jv, Write const& write)
282{
283 detail::write_value(write, jv);
284 write("\n", 1);
285}
286
298{
300
301public:
310 Compact(Json::Value&& jv) : jv_{std::move(jv)}
311 {
312 }
313
315 operator<<(std::ostream& o, Compact const& cJv)
316 {
318 [&o](void const* data, std::size_t n) { o.write(static_cast<char const*>(data), n); }, cJv.jv_);
319 return o;
320 }
321};
322
323} // namespace Json
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:34
virtual ~FastWriter()
Definition json_writer.h:37
std::string write(Value const &root) override
void writeValue(Value const &value)
FastWriter()=default
std::string document_
Definition json_writer.h:49
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)
void writeValue(Value const &value)
bool isMultilineArray(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:71
ChildValues childValues_
bool isMultilineArray(Value const &value)
std::string write(Value const &root) override
Serialize a Value in JSON format.
virtual ~StyledWriter()
Definition json_writer.h:74
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)
Represents a JSON value.
Definition json_value.h:130
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:16
virtual std::string write(Value const &root)=0
virtual ~WriterBase()
Definition json_writer.h:18
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:5
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:24
@ nullValue
'null' value
Definition json_value.h:19
@ stringValue
UTF-8 string value.
Definition json_value.h:23
@ realValue
double value
Definition json_value.h:22
@ arrayValue
array value (ordered list)
Definition json_value.h:25
@ intValue
signed integer value
Definition json_value.h:20
@ objectValue
object value (collection of name/value pairs).
Definition json_value.h:26
@ uintValue
unsigned integer value
Definition json_value.h:21
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)