8000 Removed friend relationship between JsonVariant and JsonSerializer · java64/ArduinoJson@923d3e8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 923d3e8

Browse files
committed
Removed friend relationship between JsonVariant and JsonSerializer
1 parent 0d1623e commit 923d3e8

File tree

3 files changed

+75
-42
lines changed

3 files changed

+75
-42
lines changed

src/ArduinoJson/JsonVariant.hpp

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ namespace ArduinoJson {
2727
// Forward declarations.
2828
class JsonArray;
2929
class JsonObject;
30-
namespace Internals {
31-
template <typename Print>
32-
class JsonSerializer;
33-
}
3430

3531
// A variant that can be a any value serializable to a JSON value.
3632
//
@@ -40,9 +36,6 @@ class JsonSerializer;
4036
// - a string (const char*)
4137
// - a reference to a JsonArray or JsonObject
4238
class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
43-
template <typename Print>
44-
friend class Internals::JsonSerializer;
45-
4639
public:
4740
// Creates an uninitialized JsonVariant
4841
JsonVariant() : _type(Internals::JSON_UNDEFINED) {}
@@ -317,6 +310,39 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
317310
return _type != Internals::JSON_UNDEFINED;
318311
}
319312

313+
template <typename Visitor>
314+
void visit(Visitor visitor) const {
315+
using namespace Internals;
316+
switch (_type) {
317+
case JSON_FLOAT:
318+
return visitor.acceptFloat(_content.asFloat);
319+
320+
case JSON_ARRAY:
321+
return visitor.acceptArray(*_content.asArray);
322+
323+
case JSON_OBJECT:
324+
return visitor.acceptObject(*_content.asObject);
325+
326+
case JSON_STRING:
327+
return visitor.acceptString(_content.asString);
328+
329+
case JSON_UNPARSED:
330+
return visitor.acceptRawJson(_content.asString);
331+
332+
case JSON_NEGATIVE_INTEGER:
333+
return visitor.acceptNegativeInteger(_content.asInteger);
334+
335+
case JSON_POSITIVE_INTEGER:
336+
return visitor.acceptPositiveInteger(_content.asInteger);
337+
338+
case JSON_BOOLEAN:
339+
return visitor.acceptBoolean(_content.asInteger != 0);
340+
341+
default: // JSON_UNDEFINED
342+
return visitor.acceptUndefined();
343+
}
344+
}
345+
320346
private:
321347
JsonArray &variantAsArray() const;
322348
JsonObject &variantAsObject() const;

src/ArduinoJson/Serialization/JsonSerializer.hpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,47 @@ class JsonSerializer {
3636
template <typename TKey>
3737
static void serialize(const JsonObjectSubscript<TKey> &, Writer &);
3838
static void serialize(const JsonVariant &, Writer &);
39+
40+
struct Visitor {
41+
Visitor(Writer *writer) : _writer(writer) {}
42+
43+
void acceptFloat(JsonFloat value) {
44+
_writer->writeFloat(value);
45+
}
46+
47+
void acceptArray(const JsonArray &value) {
48+
serialize(value, *_writer);
49+
}
50+
51+
void acceptObject(const JsonObject &value) {
52+
serialize(value, *_writer);
53+
}
54+
55+
void acceptString(const char *value) {
56+
_writer->writeString(value);
57+
}
58+
59+
void acceptRawJson(const char *value) {
60+
_writer->writeRaw(value);
61+
}
62+
63+
void acceptNegativeInteger(JsonUInt value) {
64+
_writer->writeRaw('-');
65+
_writer->writeInteger(value);
66+
}
67+
68+
void acceptPositiveInteger(JsonUInt value) {
69+
_writer->writeInteger(value);
70+
}
71+
72+
void acceptBoolean(bool value) {
73+
_writer->writeBoolean(value);
74+
}
75+
76+
void acceptUndefined() {}
77+
78+
Writer *_writer;
79+
};
3980
};
4081
} // namespace Internals
4182

src/ArduinoJson/Serialization/JsonSerializerImpl.hpp

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -65,39 +65,5 @@ inline void ArduinoJson::Internals::JsonSerializer<Writer>::serialize(
6565
template <typename Writer>
6666
inline void ArduinoJson::Internals::JsonSerializer<Writer>::serialize(
6767
const JsonVariant& variant, Writer& writer) {
68-
switch (variant._type) {
69-
case JSON_FLOAT:
70-
writer.writeFloat(variant._content.asFloat);
71-
return;
72-
73-
case JSON_ARRAY:
74-
serialize(*variant._content.asArray, writer);
75-
return;
76-
77-
case JSON_OBJECT:
78-
serialize(*variant._content.asObject, writer);
79-
return;
80-
81-
case JSON_STRING:
82-
writer.writeString(variant._content.asString);
83-
return;
84-
85-
case JSON_UNPARSED:
86-
writer.writeRaw(variant._content.asString);
87-
return;
88-
89-
case JSON_NEGATIVE_INTEGER:
90-
writer.writeRaw('-'); // Falls through.
91-
92-
case JSON_POSITIVE_INTEGER:
93-
writer.writeInteger(variant._content.asInteger);
94-
return;
95-
96-
case JSON_BOOLEAN:
97-
writer.writeBoolean(variant._content.asInteger != 0);
98-
return;
99-
100-
default: // JSON_UNDEFINED
101-
return;
102-
}
68+
variant.visit(Visitor(&writer));
10369
}

0 commit comments

Comments
 (0)
0