Warning, file /include/nlohmann/detail/input/json_sax.hpp was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include <cstddef>
0012 #include <string> // string
0013 #include <utility> // move
0014 #include <vector> // vector
0015
0016 #include <nlohmann/detail/exceptions.hpp>
0017 #include <nlohmann/detail/macro_scope.hpp>
0018 #include <nlohmann/detail/string_concat.hpp>
0019
0020 NLOHMANN_JSON_NAMESPACE_BEGIN
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 template<typename BasicJsonType>
0031 struct json_sax
0032 {
0033 using number_integer_t = typename BasicJsonType::number_integer_t;
0034 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
0035 using number_float_t = typename BasicJsonType::number_float_t;
0036 using string_t = typename BasicJsonType::string_t;
0037 using binary_t = typename BasicJsonType::binary_t;
0038
0039
0040
0041
0042
0043 virtual bool null() = 0;
0044
0045
0046
0047
0048
0049
0050 virtual bool boolean(bool val) = 0;
0051
0052
0053
0054
0055
0056
0057 virtual bool number_integer(number_integer_t val) = 0;
0058
0059
0060
0061
0062
0063
0064 virtual bool number_unsigned(number_unsigned_t val) = 0;
0065
0066
0067
0068
0069
0070
0071
0072 virtual bool number_float(number_float_t val, const string_t& s) = 0;
0073
0074
0075
0076
0077
0078
0079
0080 virtual bool string(string_t& val) = 0;
0081
0082
0083
0084
0085
0086
0087
0088 virtual bool binary(binary_t& val) = 0;
0089
0090
0091
0092
0093
0094
0095
0096 virtual bool start_object(std::size_t elements) = 0;
0097
0098
0099
0100
0101
0102
0103
0104 virtual bool key(string_t& val) = 0;
0105
0106
0107
0108
0109
0110 virtual bool end_object() = 0;
0111
0112
0113
0114
0115
0116
0117
0118 virtual bool start_array(std::size_t elements) = 0;
0119
0120
0121
0122
0123
0124 virtual bool end_array() = 0;
0125
0126
0127
0128
0129
0130
0131
0132
0133 virtual bool parse_error(std::size_t position,
0134 const std::string& last_token,
0135 const detail::exception& ex) = 0;
0136
0137 json_sax() = default;
0138 json_sax(const json_sax&) = default;
0139 json_sax(json_sax&&) noexcept = default;
0140 json_sax& operator=(const json_sax&) = default;
0141 json_sax& operator=(json_sax&&) noexcept = default;
0142 virtual ~json_sax() = default;
0143 };
0144
0145 namespace detail
0146 {
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160 template<typename BasicJsonType>
0161 class json_sax_dom_parser
0162 {
0163 public:
0164 using number_integer_t = typename BasicJsonType::number_integer_t;
0165 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
0166 using number_float_t = typename BasicJsonType::number_float_t;
0167 using string_t = typename BasicJsonType::string_t;
0168 using binary_t = typename BasicJsonType::binary_t;
0169
0170
0171
0172
0173
0174
0175 explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true)
0176 : root(r), allow_exceptions(allow_exceptions_)
0177 {}
0178
0179
0180 json_sax_dom_parser(const json_sax_dom_parser&) = delete;
0181 json_sax_dom_parser(json_sax_dom_parser&&) = default;
0182 json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
0183 json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default;
0184 ~json_sax_dom_parser() = default;
0185
0186 bool null()
0187 {
0188 handle_value(nullptr);
0189 return true;
0190 }
0191
0192 bool boolean(bool val)
0193 {
0194 handle_value(val);
0195 return true;
0196 }
0197
0198 bool number_integer(number_integer_t val)
0199 {
0200 handle_value(val);
0201 return true;
0202 }
0203
0204 bool number_unsigned(number_unsigned_t val)
0205 {
0206 handle_value(val);
0207 return true;
0208 }
0209
0210 bool number_float(number_float_t val, const string_t& )
0211 {
0212 handle_value(val);
0213 return true;
0214 }
0215
0216 bool string(string_t& val)
0217 {
0218 handle_value(val);
0219 return true;
0220 }
0221
0222 bool binary(binary_t& val)
0223 {
0224 handle_value(std::move(val));
0225 return true;
0226 }
0227
0228 bool start_object(std::size_t len)
0229 {
0230 ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
0231
0232 if (JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size()))
0233 {
0234 JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back()));
0235 }
0236
0237 return true;
0238 }
0239
0240 bool key(string_t& val)
0241 {
0242 JSON_ASSERT(!ref_stack.empty());
0243 JSON_ASSERT(ref_stack.back()->is_object());
0244
0245
0246 object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val));
0247 return true;
0248 }
0249
0250 bool end_object()
0251 {
0252 JSON_ASSERT(!ref_stack.empty());
0253 JSON_ASSERT(ref_stack.back()->is_object());
0254
0255 ref_stack.back()->set_parents();
0256 ref_stack.pop_back();
0257 return true;
0258 }
0259
0260 bool start_array(std::size_t len)
0261 {
0262 ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
0263
0264 if (JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size()))
0265 {
0266 JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back()));
0267 }
0268
0269 return true;
0270 }
0271
0272 bool end_array()
0273 {
0274 JSON_ASSERT(!ref_stack.empty());
0275 JSON_ASSERT(ref_stack.back()->is_array());
0276
0277 ref_stack.back()->set_parents();
0278 ref_stack.pop_back();
0279 return true;
0280 }
0281
0282 template<class Exception>
0283 bool parse_error(std::size_t , const std::string& ,
0284 const Exception& ex)
0285 {
0286 errored = true;
0287 static_cast<void>(ex);
0288 if (allow_exceptions)
0289 {
0290 JSON_THROW(ex);
0291 }
0292 return false;
0293 }
0294
0295 constexpr bool is_errored() const
0296 {
0297 return errored;
0298 }
0299
0300 private:
0301
0302
0303
0304
0305
0306
0307 template<typename Value>
0308 JSON_HEDLEY_RETURNS_NON_NULL
0309 BasicJsonType* handle_value(Value&& v)
0310 {
0311 if (ref_stack.empty())
0312 {
0313 root = BasicJsonType(std::forward<Value>(v));
0314 return &root;
0315 }
0316
0317 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
0318
0319 if (ref_stack.back()->is_array())
0320 {
0321 ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v));
0322 return &(ref_stack.back()->m_data.m_value.array->back());
0323 }
0324
0325 JSON_ASSERT(ref_stack.back()->is_object());
0326 JSON_ASSERT(object_element);
0327 *object_element = BasicJsonType(std::forward<Value>(v));
0328 return object_element;
0329 }
0330
0331
0332 BasicJsonType& root;
0333
0334 std::vector<BasicJsonType*> ref_stack {};
0335
0336 BasicJsonType* object_element = nullptr;
0337
0338 bool errored = false;
0339
0340 const bool allow_exceptions = true;
0341 };
0342
0343 template<typename BasicJsonType>
0344 class json_sax_dom_callback_parser
0345 {
0346 public:
0347 using number_integer_t = typename BasicJsonType::number_integer_t;
0348 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
0349 using number_float_t = typename BasicJsonType::number_float_t;
0350 using string_t = typename BasicJsonType::string_t;
0351 using binary_t = typename BasicJsonType::binary_t;
0352 using parser_callback_t = typename BasicJsonType::parser_callback_t;
0353 using parse_event_t = typename BasicJsonType::parse_event_t;
0354
0355 json_sax_dom_callback_parser(BasicJsonType& r,
0356 const parser_callback_t cb,
0357 const bool allow_exceptions_ = true)
0358 : root(r), callback(cb), allow_exceptions(allow_exceptions_)
0359 {
0360 keep_stack.push_back(true);
0361 }
0362
0363
0364 json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete;
0365 json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default;
0366 json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete;
0367 json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default;
0368 ~json_sax_dom_callback_parser() = default;
0369
0370 bool null()
0371 {
0372 handle_value(nullptr);
0373 return true;
0374 }
0375
0376 bool boolean(bool val)
0377 {
0378 handle_value(val);
0379 return true;
0380 }
0381
0382 bool number_integer(number_integer_t val)
0383 {
0384 handle_value(val);
0385 return true;
0386 }
0387
0388 bool number_unsigned(number_unsigned_t val)
0389 {
0390 handle_value(val);
0391 return true;
0392 }
0393
0394 bool number_float(number_float_t val, const string_t& )
0395 {
0396 handle_value(val);
0397 return true;
0398 }
0399
0400 bool string(string_t& val)
0401 {
0402 handle_value(val);
0403 return true;
0404 }
0405
0406 bool binary(binary_t& val)
0407 {
0408 handle_value(std::move(val));
0409 return true;
0410 }
0411
0412 bool start_object(std::size_t len)
0413 {
0414
0415 const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::object_start, discarded);
0416 keep_stack.push_back(keep);
0417
0418 auto val = handle_value(BasicJsonType::value_t::object, true);
0419 ref_stack.push_back(val.second);
0420
0421
0422 if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size()))
0423 {
0424 JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back()));
0425 }
0426
0427 return true;
0428 }
0429
0430 bool key(string_t& val)
0431 {
0432 BasicJsonType k = BasicJsonType(val);
0433
0434
0435 const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::key, k);
0436 key_keep_stack.push_back(keep);
0437
0438
0439 if (keep && ref_stack.back())
0440 {
0441 object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val) = discarded);
0442 }
0443
0444 return true;
0445 }
0446
0447 bool end_object()
0448 {
0449 if (ref_stack.back())
0450 {
0451 if (!callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()))
0452 {
0453
0454 *ref_stack.back() = discarded;
0455 }
0456 else
0457 {
0458 ref_stack.back()->set_parents();
0459 }
0460 }
0461
0462 JSON_ASSERT(!ref_stack.empty());
0463 JSON_ASSERT(!keep_stack.empty());
0464 ref_stack.pop_back();
0465 keep_stack.pop_back();
0466
0467 if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())
0468 {
0469
0470 for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)
0471 {
0472 if (it->is_discarded())
0473 {
0474 ref_stack.back()->erase(it);
0475 break;
0476 }
0477 }
0478 }
0479
0480 return true;
0481 }
0482
0483 bool start_array(std::size_t len)
0484 {
0485 const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::array_start, discarded);
0486 keep_stack.push_back(keep);
0487
0488 auto val = handle_value(BasicJsonType::value_t::array, true);
0489 ref_stack.push_back(val.second);
0490
0491
0492 if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != static_cast<std::size_t>(-1) && len > ref_stack.back()->max_size()))
0493 {
0494 JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back()));
0495 }
0496
0497 return true;
0498 }
0499
0500 bool end_array()
0501 {
0502 bool keep = true;
0503
0504 if (ref_stack.back())
0505 {
0506 keep = callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());
0507 if (keep)
0508 {
0509 ref_stack.back()->set_parents();
0510 }
0511 else
0512 {
0513
0514 *ref_stack.back() = discarded;
0515 }
0516 }
0517
0518 JSON_ASSERT(!ref_stack.empty());
0519 JSON_ASSERT(!keep_stack.empty());
0520 ref_stack.pop_back();
0521 keep_stack.pop_back();
0522
0523
0524 if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())
0525 {
0526 ref_stack.back()->m_data.m_value.array->pop_back();
0527 }
0528
0529 return true;
0530 }
0531
0532 template<class Exception>
0533 bool parse_error(std::size_t , const std::string& ,
0534 const Exception& ex)
0535 {
0536 errored = true;
0537 static_cast<void>(ex);
0538 if (allow_exceptions)
0539 {
0540 JSON_THROW(ex);
0541 }
0542 return false;
0543 }
0544
0545 constexpr bool is_errored() const
0546 {
0547 return errored;
0548 }
0549
0550 private:
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566 template<typename Value>
0567 std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false)
0568 {
0569 JSON_ASSERT(!keep_stack.empty());
0570
0571
0572
0573 if (!keep_stack.back())
0574 {
0575 return {false, nullptr};
0576 }
0577
0578
0579 auto value = BasicJsonType(std::forward<Value>(v));
0580
0581
0582 const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value);
0583
0584
0585 if (!keep)
0586 {
0587 return {false, nullptr};
0588 }
0589
0590 if (ref_stack.empty())
0591 {
0592 root = std::move(value);
0593 return {true, & root};
0594 }
0595
0596
0597
0598 if (!ref_stack.back())
0599 {
0600 return {false, nullptr};
0601 }
0602
0603
0604 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
0605
0606
0607 if (ref_stack.back()->is_array())
0608 {
0609 ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));
0610 return {true, & (ref_stack.back()->m_data.m_value.array->back())};
0611 }
0612
0613
0614 JSON_ASSERT(ref_stack.back()->is_object());
0615
0616 JSON_ASSERT(!key_keep_stack.empty());
0617 const bool store_element = key_keep_stack.back();
0618 key_keep_stack.pop_back();
0619
0620 if (!store_element)
0621 {
0622 return {false, nullptr};
0623 }
0624
0625 JSON_ASSERT(object_element);
0626 *object_element = std::move(value);
0627 return {true, object_element};
0628 }
0629
0630
0631 BasicJsonType& root;
0632
0633 std::vector<BasicJsonType*> ref_stack {};
0634
0635 std::vector<bool> keep_stack {};
0636
0637 std::vector<bool> key_keep_stack {};
0638
0639 BasicJsonType* object_element = nullptr;
0640
0641 bool errored = false;
0642
0643 const parser_callback_t callback = nullptr;
0644
0645 const bool allow_exceptions = true;
0646
0647 BasicJsonType discarded = BasicJsonType::value_t::discarded;
0648 };
0649
0650 template<typename BasicJsonType>
0651 class json_sax_acceptor
0652 {
0653 public:
0654 using number_integer_t = typename BasicJsonType::number_integer_t;
0655 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
0656 using number_float_t = typename BasicJsonType::number_float_t;
0657 using string_t = typename BasicJsonType::string_t;
0658 using binary_t = typename BasicJsonType::binary_t;
0659
0660 bool null()
0661 {
0662 return true;
0663 }
0664
0665 bool boolean(bool )
0666 {
0667 return true;
0668 }
0669
0670 bool number_integer(number_integer_t )
0671 {
0672 return true;
0673 }
0674
0675 bool number_unsigned(number_unsigned_t )
0676 {
0677 return true;
0678 }
0679
0680 bool number_float(number_float_t , const string_t& )
0681 {
0682 return true;
0683 }
0684
0685 bool string(string_t& )
0686 {
0687 return true;
0688 }
0689
0690 bool binary(binary_t& )
0691 {
0692 return true;
0693 }
0694
0695 bool start_object(std::size_t = static_cast<std::size_t>(-1))
0696 {
0697 return true;
0698 }
0699
0700 bool key(string_t& )
0701 {
0702 return true;
0703 }
0704
0705 bool end_object()
0706 {
0707 return true;
0708 }
0709
0710 bool start_array(std::size_t = static_cast<std::size_t>(-1))
0711 {
0712 return true;
0713 }
0714
0715 bool end_array()
0716 {
0717 return true;
0718 }
0719
0720 bool parse_error(std::size_t , const std::string& , const detail::exception& )
0721 {
0722 return false;
0723 }
0724 };
0725
0726 }
0727 NLOHMANN_JSON_NAMESPACE_END