xrpld
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 <cstddef>
7#include <ostream>
8#include <string>
9#include <utility>
10#include <vector>
11
12namespace json {
13
14class Value;
15
20{
21public:
22 virtual ~WriterBase() = default;
23 virtual std::string
24 write(Value const& root) = 0;
25};
26
35
36class FastWriter : public WriterBase
37{
38public:
39 FastWriter() = default;
40 ~FastWriter() override = default;
41
42public: // overridden from Writer
44 write(Value const& root) override;
45
46private:
47 void
48 writeValue(Value const& value);
49
51};
52
73{
74public:
76 ~StyledWriter() override = default;
77
78public: // 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 isMultilineArray(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
138{
139public:
140 StyledStreamWriter(std::string indentation = "\t");
142
143public:
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 isMultilineArray(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
198operator<<(std::ostream&, Value const& root);
199
200//------------------------------------------------------------------------------
201
202// Helpers for stream
203namespace detail {
204
205template <class Write>
206void
207writeString(Write const& write, std::string const& s)
208{
209 write(s.data(), s.size());
210}
211
212template <class Write>
213void
214writeValue(Write const& write, Value const& value)
215{
216 switch (value.type())
217 {
218 case ValueType::Null:
219 write("null", 4);
220 break;
221
222 case ValueType::Int:
223 writeString(write, valueToString(value.asInt()));
224 break;
225
226 case ValueType::UInt:
227 writeString(write, valueToString(value.asUInt()));
228 break;
229
230 case ValueType::Real:
231 writeString(write, valueToString(value.asDouble()));
232 break;
233
235 writeString(write, valueToQuotedString(value.asCString()));
236 break;
237
239 writeString(write, valueToString(value.asBool()));
240 break;
241
242 case ValueType::Array: {
243 write("[", 1);
244 int const size = value.size();
245 for (int index = 0; index < size; ++index)
246 {
247 if (index > 0)
248 write(",", 1);
249 writeValue(write, value[index]);
250 }
251 write("]", 1);
252 break;
253 }
254
255 case ValueType::Object: {
256 Value::Members const members = value.getMemberNames();
257 write("{", 1);
258 for (auto it = members.begin(); it != members.end(); ++it)
259 {
260 std::string const& name = *it;
261 if (it != members.begin())
262 write(",", 1);
263
264 writeString(write, valueToQuotedString(name.c_str()));
265 write(":", 1);
266 writeValue(write, value[name]);
267 }
268 write("}", 1);
269 break;
270 }
271 }
272}
273
274} // namespace detail
275
283template <class Write>
284void
285stream(json::Value const& jv, Write const& write)
286{
287 detail::writeValue(write, jv);
288 write("\n", 1);
289}
290
303{
305
306public:
316 Compact(json::Value&& jv) : jv_{std::move(jv)}
317 {
318 }
319
321 operator<<(std::ostream& o, Compact const& cJv)
322 {
324 [&o](void const* data, std::size_t n) { o.write(static_cast<char const*>(data), n); },
325 cJv.jv_);
326 return o;
327 }
328};
329
330} // namespace json
T begin(T... args)
T c_str(T... args)
friend std::ostream & operator<<(std::ostream &o, Compact const &cJv)
json::Value jv_
Compact(json::Value &&jv)
Wrap a json::Value for compact streaming.
void writeValue(Value const &value)
FastWriter()=default
std::string write(Value const &root) override
std::string document_
Definition json_writer.h:50
~FastWriter() override=default
void pushValue(std::string const &value)
void writeArrayValue(Value const &value)
std::ostream * document_
void write(std::ostream &out, Value const &root)
Serialize a Value in JSON format.
void writeValue(Value const &value)
bool isMultilineArray(Value const &value)
StyledStreamWriter(std::string indentation="\t")
void writeWithIndent(std::string const &value)
std::vector< std::string > ChildValues
void pushValue(std::string const &value)
ChildValues childValues_
bool isMultilineArray(Value const &value)
std::string write(Value const &root) override
Serialize a Value in JSON format.
std::string indentString_
void writeValue(Value const &value)
void writeWithIndent(std::string const &value)
std::vector< std::string > ChildValues
void writeArrayValue(Value const &value)
std::string document_
~StyledWriter() override=default
Represents a JSON value.
Definition json_value.h:117
std::vector< std::string > Members
Definition json_value.h:121
Abstract class for writers.
Definition json_writer.h:20
virtual std::string write(Value const &root)=0
virtual ~WriterBase()=default
T data(T... args)
T end(T... args)
void writeString(Write const &write, std::string const &s)
void writeValue(Write const &write, Value const &value)
JSON (JavaScript Object Notation).
Definition json_errors.h:5
int Int
std::string valueToQuotedString(char const *value)
void stream(json::Value const &jv, Write const &write)
Stream compact JSON to the specified function.
unsigned int UInt
@ UInt
unsigned integer value
Definition json_value.h:24
@ Int
signed integer value
Definition json_value.h:23
@ String
UTF-8 string value.
Definition json_value.h:26
@ Boolean
bool value
Definition json_value.h:27
@ Array
array value (ordered list)
Definition json_value.h:28
@ Object
object value (collection of name/value pairs).
Definition json_value.h:29
@ Real
double value
Definition json_value.h:25
@ Null
'null' value
Definition json_value.h:22
std::ostream & operator<<(std::ostream &, Value const &root)
Output using the StyledStreamWriter.
std::string valueToString(Int value)
STL namespace.
T size(T... args)
T write(T... args)