Skip to content

Commit 3a88ad3

Browse files
committed
FEATURE: Names only to disambiguate variant and not for everything.
1 parent 7e13502 commit 3a88ad3

File tree

3 files changed

+45
-53
lines changed

3 files changed

+45
-53
lines changed

pre/json/detail/dejsonizer.hpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,7 @@ namespace pre { namespace json { namespace detail {
5858
template<class T,
5959
enable_if_is_adapted_struct_t<T>* = nullptr>
6060
void operator()(T& value) const {
61-
auto struct_it = _json_object.find("struct");
62-
if ( (_json_object.is_object()) &&
63-
(struct_it != _json_object.end()) &&
64-
( *struct_it == boost::typeindex::type_id<T>().pretty_name()) ) {
61+
if (_json_object.is_object()) {
6562
pre::fusion::for_each_member(value, *this);
6663
} else {
6764
throw std::runtime_error("The JSON Object " + _json_object.dump() + " isn't an object that we can map to an internal type");
@@ -76,16 +73,17 @@ namespace pre { namespace json { namespace detail {
7673

7774
template< typename U > void operator()(U& x) {
7875
if (!successed) {
79-
try {
80-
dejsonizer dejsonizer(_json_object);
81-
U test_value;
82-
dejsonizer(test_value);
83-
successed = true;
84-
value = test_value;
85-
} catch (...) { //XXX: LOGIC BASED ON Exceptions !!! ARgh
86-
//std::cout << "ERROR" << std::endl;
87-
//std::cout << boost::current_exception_diagnostic_information(true) << std::endl;
88-
}
76+
auto struct_it = _json_object.find("struct");
77+
78+
if ( (struct_it != _json_object.end()) &&
79+
(*struct_it == boost::typeindex::type_id<U>().pretty_name()) ) {
80+
81+
dejsonizer dejsonizer(_json_object);
82+
U test_value;
83+
dejsonizer(test_value);
84+
successed = true;
85+
value = test_value;
86+
}
8987
}
9088
}
9189

pre/json/detail/jsonizer.hpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ namespace pre { namespace json { namespace detail {
2121
struct jsonizer : public boost::static_visitor<> {
2222

2323
jsonizer(nlohmann::json& json_object)
24-
: boost::static_visitor<>(), _json_object(json_object) {}
24+
: boost::static_visitor<>(),
25+
_json_object(json_object),
26+
_disambiguate_struct(false) {}
2527

2628
template<class T>
2729
void operator()(const char* name, const T& value) const {
@@ -52,7 +54,11 @@ namespace pre { namespace json { namespace detail {
5254
template<class T,
5355
enable_if_is_adapted_struct_t<T>* = nullptr>
5456
void operator()(const T& value) const {
55-
_json_object["struct"] = boost::typeindex::type_id<T>().pretty_name();
57+
58+
if (_disambiguate_struct) {
59+
_json_object["struct"] = boost::typeindex::type_id<T>().pretty_name();
60+
_disambiguate_struct = false; // Do it only once in hierarchy
61+
}
5662
pre::fusion::for_each_member(value, *this);
5763
}
5864

@@ -66,6 +72,8 @@ namespace pre { namespace json { namespace detail {
6672
template<class T,
6773
enable_if_is_variant_t<T>* = nullptr>
6874
void operator()(const T& value) const {
75+
// struct has to be disambiguated in case of variant.
76+
_disambiguate_struct = true;
6977
boost::apply_visitor(*this, value);
7078
}
7179

@@ -112,6 +120,7 @@ namespace pre { namespace json { namespace detail {
112120

113121
private:
114122
nlohmann::json& _json_object;
123+
mutable bool _disambiguate_struct;
115124

116125
};
117126

test/dejsonize_test.cpp

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -103,18 +103,17 @@ BOOST_AUTO_TEST_CASE (composedtype) {
103103
};
104104

105105
auto json_customer = pre::json::to_json(customer);
106-
std::cout << json_customer << std::endl;
106+
std::cout << json_customer.dump(2) << std::endl;
107107

108108
auto customer_parsed = pre::json::from_json<datamodel::customer>(json_customer);
109109
BOOST_ASSERT(customer_parsed == customer);
110110

111111
auto json_customer_after_reserialize = pre::json::to_json(customer);
112-
std::cout << json_customer_after_reserialize << std::endl;
112+
std::cout << json_customer_after_reserialize.dump(2) << std::endl;
113113
BOOST_ASSERT(json_customer == json_customer_after_reserialize);
114114

115115
// testing an adapted skill alone from plain json
116116
nlohmann::json obj {
117-
{"struct", "datamodel::skill"},
118117
{"skill_name", "GML"},
119118
{"experience", 10}
120119
};
@@ -123,7 +122,7 @@ BOOST_AUTO_TEST_CASE (composedtype) {
123122

124123
BOOST_ASSERT(skill_parsed.skill_name == "GML");
125124
BOOST_ASSERT(skill_parsed.experience == 10);
126-
std::cout << pre::json::to_json(skill_parsed) << std::endl;
125+
std::cout << pre::json::to_json(skill_parsed).dump(2) << std::endl;
127126
}
128127

129128
/**
@@ -139,22 +138,20 @@ BOOST_AUTO_TEST_CASE (nested) {
139138

140139
datamodel::sales_assitant assistant{"Mr. Gold", 130000, customer};
141140
auto json_sales_assistant = pre::json::to_json(assistant);
142-
std::cout << json_sales_assistant << std::endl;
141+
std::cout << json_sales_assistant.dump(2) << std::endl;
143142

144143
auto deser_assistant = pre::json::from_json<datamodel::sales_assitant>(json_sales_assistant);
145144

146145
auto json_sales_assistant_reserialized = pre::json::to_json(deser_assistant);
147-
std::cout << json_sales_assistant_reserialized << std::endl;
146+
std::cout << json_sales_assistant_reserialized.dump(2) << std::endl;
148147

149148
BOOST_ASSERT(json_sales_assistant_reserialized == json_sales_assistant);
150149
}
151150

152151
BOOST_AUTO_TEST_CASE (working_plain_json) {
153152
std::string json = R"(
154153
{
155-
"struct": "datamodel::sales_assitant",
156154
"main_customer": {
157-
"struct": "datamodel::customer",
158155
"age": 43,
159156
"friends_id": [
160157
1,
@@ -163,17 +160,14 @@ BOOST_AUTO_TEST_CASE (working_plain_json) {
163160
"name": "Mr. Dupond",
164161
"skillset": [
165162
{
166-
"struct": "datamodel::skill",
167163
"experience": 10,
168164
"skill_name": "C++"
169165
},
170166
{
171-
"struct": "datamodel::skill",
172167
"experience": 20,
173168
"skill_name": "GML"
174169
},
175170
{
176-
"struct": "datamodel::skill",
177171
"experience": 2,
178172
"skill_name": "Linux"
179173
}
@@ -188,17 +182,15 @@ BOOST_AUTO_TEST_CASE (working_plain_json) {
188182
auto deser_assistant = pre::json::from_json<datamodel::sales_assitant>(json);
189183

190184
auto json_sales_assistant_reserialized = pre::json::to_json(deser_assistant);
191-
std::cout << json_sales_assistant_reserialized << std::endl;
185+
std::cout << json_sales_assistant_reserialized.dump(2) << std::endl;
192186
}
193187

194188
BOOST_AUTO_TEST_CASE (incorrect_plain_json) {
195189
// Test buggy keys
196190
try {
197191
auto json = R"(
198192
{
199-
"struct": "datamodel::sales_assitant",
200193
"main_customer": {
201-
"struct": "datamodel::customer",
202194
"BUGGYKEYage": 43,
203195
"friends_id": [
204196
1,
@@ -207,17 +199,14 @@ BOOST_AUTO_TEST_CASE (incorrect_plain_json) {
207199
"name": "Mr. Dupond",
208200
"skillset": [
209201
{
210-
"struct": "datamodel::skill",
211202
"experience": 10,
212203
"skill_name": "C++"
213204
},
214205
{
215-
"struct": "datamodel::skill",
216206
"experience": 20,
217207
"skill_name": "GML"
218208
},
219209
{
220-
"struct": "datamodel::skill",
221210
"experience": 2,
222211
"skill_name": "Linux"
223212
}
@@ -244,7 +233,6 @@ BOOST_AUTO_TEST_CASE (incorrect_plain_json) {
244233
auto json = R"(
245234
{
246235
"main_customer": {
247-
"struct": "datamodel::customer",
248236
"age": "He is 43 years old, does it fit in an integer ?",
249237
"friends_id": [
250238
1,
@@ -253,17 +241,14 @@ BOOST_AUTO_TEST_CASE (incorrect_plain_json) {
253241
"name": "Mr. Dupond",
254242
"skillset": [
255243
{
256-
"struct": "datamodel::skill",
257244
"experience": 10,
258245
"skill_name": "C++"
259246
},
260247
{
261-
"struct": "datamodel::skill",
262248
"experience": 20,
263249
"skill_name": "GML"
264250
},
265251
{
266-
"struct": "datamodel::skill",
267252
"experience": 2,
268253
"skill_name": "Linux"
269254
}
@@ -299,7 +284,7 @@ BOOST_AUTO_TEST_CASE (containers_direct) {
299284
};
300285

301286
auto skills_json = pre::json::to_json(skills);
302-
std::cout << skills_json << std::endl;
287+
std::cout << skills_json.dump(2) << std::endl;
303288

304289
auto skills_deserialized = pre::json::from_json<std::vector<datamodel::skill>>(skills_json);
305290
BOOST_ASSERT(skills == skills_deserialized);
@@ -368,12 +353,12 @@ BOOST_AUTO_TEST_CASE (vairants) {
368353
};
369354

370355
auto employees_json = pre::json::to_json(employees);
371-
std::cout << employees_json << std::endl;
356+
std::cout << employees_json.dump(2) << std::endl;
372357

373358
auto employees_deserialized = pre::json::from_json<std::vector<datamodel::employee>>(employees_json);
374359

375360
auto employees_reserialized = pre::json::to_json(employees_deserialized);
376-
std::cout << employees_reserialized << std::endl;
361+
std::cout << employees_reserialized.dump(2) << std::endl;
377362

378363
BOOST_ASSERT(employees == employees_deserialized);
379364
}
@@ -402,7 +387,7 @@ BOOST_AUTO_TEST_CASE(maps) {
402387
};
403388

404389
auto some_json = pre::json::to_json(some);
405-
std::cout << some_json << std::endl;
390+
std::cout << some_json.dump(2) << std::endl;
406391

407392
auto some_deserialized = pre::json::from_json<datamodel::struct_with_a_map>(some_json);
408393

@@ -441,12 +426,12 @@ BOOST_AUTO_TEST_CASE (enums) {
441426
datamodel::some_value val{datamodel::my_value_type::TYPE2, 12, datamodel::THREE};
442427

443428
auto val_json = pre::json::to_json(val);
444-
std::cout << val_json << std::endl;
429+
std::cout << val_json.dump(2) << std::endl;
445430

446431
auto val_deserialized = pre::json::from_json<datamodel::some_value>(val_json);
447432

448433
auto val_reserialized = pre::json::to_json(val_deserialized);
449-
std::cout << val_reserialized << std::endl;
434+
std::cout << val_reserialized.dump(2) << std::endl;
450435

451436
BOOST_ASSERT(val == val_deserialized);
452437
}
@@ -456,12 +441,12 @@ BOOST_AUTO_TEST_CASE (adapted_struct_jsonize_chrono) {
456441
boost::chrono::milliseconds val{100};
457442

458443
auto val_json = pre::json::to_json(val);
459-
std::cout << val_json << std::endl;
444+
std::cout << val_json.dump(2) << std::endl;
460445

461446
auto val_deserialized = pre::json::from_json<boost::chrono::milliseconds>(val_json);
462447

463448
auto val_reserialized = pre::json::to_json(val_deserialized);
464-
std::cout << val_reserialized << std::endl;
449+
std::cout << val_reserialized.dump(2) << std::endl;
465450

466451
BOOST_ASSERT(val == val_deserialized);
467452
}
@@ -485,12 +470,12 @@ BOOST_AUTO_TEST_CASE (adapted_struct_jsonize_chrono_composed) {
485470
datamodel::some_time val{"my time", boost::chrono::milliseconds(100), std::chrono::minutes(43)};
486471

487472
auto val_json = pre::json::to_json(val);
488-
std::cout << val_json << std::endl;
473+
std::cout << val_json.dump(2) << std::endl;
489474

490475
auto val_deserialized = pre::json::from_json<datamodel::some_time>(val_json);
491476

492477
auto val_reserialized = pre::json::to_json(val_deserialized);
493-
std::cout << val_reserialized << std::endl;
478+
std::cout << val_reserialized.dump(2) << std::endl;
494479

495480
BOOST_ASSERT(val == val_deserialized);
496481
}
@@ -511,12 +496,12 @@ BOOST_AUTO_TEST_CASE (optional) {
511496
boost::optional<std::string> val{"some text"};
512497

513498
auto val_json = pre::json::to_json(val);
514-
std::cout << val_json << std::endl;
499+
std::cout << val_json.dump(2) << std::endl;
515500

516501
auto val_deserialized = pre::json::from_json<boost::optional<std::string>>(val_json);
517502

518503
auto val_reserialized = pre::json::to_json(val_deserialized);
519-
std::cout << val_reserialized << std::endl;
504+
std::cout << val_reserialized.dump(2) << std::endl;
520505

521506
BOOST_ASSERT(val == val_deserialized);
522507
}
@@ -529,12 +514,12 @@ BOOST_AUTO_TEST_CASE (optional_member) {
529514
val.other = 13.21;
530515

531516
auto val_json = pre::json::to_json(val);
532-
std::cout << val_json << std::endl;
517+
std::cout << val_json.dump(2) << std::endl;
533518

534519
auto val_deserialized = pre::json::from_json<datamodel::with_optional_member>(val_json);
535520

536521
auto val_reserialized = pre::json::to_json(val_deserialized);
537-
std::cout << val_reserialized << std::endl;
522+
std::cout << val_reserialized.dump(2) << std::endl;
538523

539524
BOOST_ASSERT(val == val_deserialized);
540525
}
@@ -544,12 +529,12 @@ BOOST_AUTO_TEST_CASE (optional_member) {
544529
val.other = 43.21;
545530

546531
auto val_json = pre::json::to_json(val);
547-
std::cout << val_json << std::endl;
532+
std::cout << val_json.dump(2) << std::endl;
548533

549534
auto val_deserialized = pre::json::from_json<datamodel::with_optional_member>(val_json);
550535

551536
auto val_reserialized = pre::json::to_json(val_deserialized);
552-
std::cout << val_reserialized << std::endl;
537+
std::cout << val_reserialized.dump(2) << std::endl;
553538

554539
BOOST_ASSERT(val == val_deserialized);
555540
}

0 commit comments

Comments
 (0)