170 using number_integer_t =
typename BasicJsonType::number_integer_t;
171 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
172 using number_float_t =
typename BasicJsonType::number_float_t;
173 using string_t =
typename BasicJsonType::string_t;
174 using binary_t =
typename BasicJsonType::binary_t;
182 explicit json_sax_dom_parser(BasicJsonType& r,
const bool allow_exceptions_ =
true, lexer_t* lexer_ =
nullptr)
183 : root(r), allow_exceptions(allow_exceptions_), m_lexer_ref(lexer_)
195 handle_value(
nullptr);
199 bool boolean(
bool val)
223 bool string(string_t& val)
229 bool binary(binary_t& val)
231 handle_value(std::move(val));
235 bool start_object(std::size_t len)
237 ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
239#if JSON_DIAGNOSTIC_POSITIONS
246 ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
250 if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))
252 JSON_THROW(out_of_range::create(408, concat(
"excessive object size: ", std::to_string(len)), ref_stack.back()));
258 bool key(string_t& val)
260 JSON_ASSERT(!ref_stack.empty());
261 JSON_ASSERT(ref_stack.back()->is_object());
264 object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val));
270 JSON_ASSERT(!ref_stack.empty());
271 JSON_ASSERT(ref_stack.back()->is_object());
273#if JSON_DIAGNOSTIC_POSITIONS
277 ref_stack.back()->end_position = m_lexer_ref->get_position();
281 ref_stack.back()->set_parents();
282 ref_stack.pop_back();
286 bool start_array(std::size_t len)
288 ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
290#if JSON_DIAGNOSTIC_POSITIONS
295 ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
299 if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))
301 JSON_THROW(out_of_range::create(408, concat(
"excessive array size: ", std::to_string(len)), ref_stack.back()));
309 JSON_ASSERT(!ref_stack.empty());
310 JSON_ASSERT(ref_stack.back()->is_array());
312#if JSON_DIAGNOSTIC_POSITIONS
316 ref_stack.back()->end_position = m_lexer_ref->get_position();
320 ref_stack.back()->set_parents();
321 ref_stack.pop_back();
325 template<
class Exception>
326 bool parse_error(std::size_t ,
const std::string& ,
330 static_cast<void>(ex);
331 if (allow_exceptions)
338 constexpr bool is_errored()
const
345#if JSON_DIAGNOSTIC_POSITIONS
346 void handle_diagnostic_positions_for_json_value(BasicJsonType& v)
353 v.end_position = m_lexer_ref->get_position();
357 case value_t::boolean:
360 v.start_position = v.end_position - (v.m_data.m_value.boolean ? 4 : 5);
367 v.start_position = v.end_position - 4;
371 case value_t::string:
374 v.start_position = v.end_position - v.m_data.m_value.string->size() - 2;
383 case value_t::discarded:
385 v.end_position = std::string::npos;
386 v.start_position = v.end_position;
390 case value_t::binary:
391 case value_t::number_integer:
392 case value_t::number_unsigned:
393 case value_t::number_float:
395 v.start_position = v.end_position - m_lexer_ref->get_string().size();
398 case value_t::object:
419 template<
typename Value>
420 JSON_HEDLEY_RETURNS_NON_NULL
421 BasicJsonType* handle_value(Value&& v)
423 if (ref_stack.empty())
425 root = BasicJsonType(std::forward<Value>(v));
427#if JSON_DIAGNOSTIC_POSITIONS
428 handle_diagnostic_positions_for_json_value(root);
434 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
436 if (ref_stack.back()->is_array())
438 ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v));
440#if JSON_DIAGNOSTIC_POSITIONS
441 handle_diagnostic_positions_for_json_value(ref_stack.back()->m_data.m_value.array->back());
444 return &(ref_stack.back()->m_data.m_value.array->back());
447 JSON_ASSERT(ref_stack.back()->is_object());
448 JSON_ASSERT(object_element);
449 *object_element = BasicJsonType(std::forward<Value>(v));
451#if JSON_DIAGNOSTIC_POSITIONS
452 handle_diagnostic_positions_for_json_value(*object_element);
455 return object_element;
461 std::vector<BasicJsonType*> ref_stack {};
463 BasicJsonType* object_element =
nullptr;
465 bool errored =
false;
467 const bool allow_exceptions =
true;
469 lexer_t* m_lexer_ref =
nullptr;
473class json_sax_dom_callback_parser
476 using number_integer_t =
typename BasicJsonType::number_integer_t;
477 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
478 using number_float_t =
typename BasicJsonType::number_float_t;
479 using string_t =
typename BasicJsonType::string_t;
480 using binary_t =
typename BasicJsonType::binary_t;
481 using parser_callback_t =
typename BasicJsonType::parser_callback_t;
482 using parse_event_t =
typename BasicJsonType::parse_event_t;
485 json_sax_dom_callback_parser(BasicJsonType& r,
486 parser_callback_t cb,
487 const bool allow_exceptions_ =
true,
488 lexer_t* lexer_ =
nullptr)
489 : root(r), callback(std::move(cb)), allow_exceptions(allow_exceptions_), m_lexer_ref(lexer_)
491 keep_stack.push_back(
true);
495 json_sax_dom_callback_parser(
const json_sax_dom_callback_parser&) =
delete;
496 json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) =
default;
497 json_sax_dom_callback_parser& operator=(
const json_sax_dom_callback_parser&) =
delete;
498 json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) =
default;
499 ~json_sax_dom_callback_parser() =
default;
503 handle_value(
nullptr);
507 bool boolean(
bool val)
513 bool number_integer(number_integer_t val)
519 bool number_unsigned(number_unsigned_t val)
525 bool number_float(number_float_t val,
const string_t& )
531 bool string(string_t& val)
537 bool binary(binary_t& val)
539 handle_value(std::move(val));
543 bool start_object(std::size_t len)
547 keep_stack.push_back(keep);
549 auto val = handle_value(BasicJsonType::value_t::object,
true);
550 ref_stack.push_back(val.second);
552 if (ref_stack.back())
555#if JSON_DIAGNOSTIC_POSITIONS
562 ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
567 if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))
569 JSON_THROW(out_of_range::create(408, concat(
"excessive object size: ", std::to_string(len)), ref_stack.back()));
575 bool key(string_t& val)
577 BasicJsonType k = BasicJsonType(val);
580 const bool keep = callback(
static_cast<int>(ref_stack.size()),
parse_event_t::key, k);
581 key_keep_stack.push_back(keep);
584 if (keep && ref_stack.back())
586 object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val) = discarded);
594 if (ref_stack.back())
599 *ref_stack.back() = discarded;
601#if JSON_DIAGNOSTIC_POSITIONS
603 handle_diagnostic_positions_for_json_value(*ref_stack.back());
609#if JSON_DIAGNOSTIC_POSITIONS
613 ref_stack.back()->end_position = m_lexer_ref->get_position();
617 ref_stack.back()->set_parents();
621 JSON_ASSERT(!ref_stack.empty());
622 JSON_ASSERT(!keep_stack.empty());
623 ref_stack.pop_back();
624 keep_stack.pop_back();
626 if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())
629 for (
auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)
631 if (it->is_discarded())
633 ref_stack.back()->erase(it);
642 bool start_array(std::size_t len)
645 keep_stack.push_back(keep);
647 auto val = handle_value(BasicJsonType::value_t::array,
true);
648 ref_stack.push_back(val.second);
650 if (ref_stack.back())
653#if JSON_DIAGNOSTIC_POSITIONS
660 ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
665 if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size()))
667 JSON_THROW(out_of_range::create(408, concat(
"excessive array size: ", std::to_string(len)), ref_stack.back()));
678 if (ref_stack.back())
684#if JSON_DIAGNOSTIC_POSITIONS
688 ref_stack.back()->end_position = m_lexer_ref->get_position();
692 ref_stack.back()->set_parents();
697 *ref_stack.back() = discarded;
699#if JSON_DIAGNOSTIC_POSITIONS
701 handle_diagnostic_positions_for_json_value(*ref_stack.back());
706 JSON_ASSERT(!ref_stack.empty());
707 JSON_ASSERT(!keep_stack.empty());
708 ref_stack.pop_back();
709 keep_stack.pop_back();
712 if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())
714 ref_stack.back()->m_data.m_value.array->pop_back();
720 template<
class Exception>
721 bool parse_error(std::size_t ,
const std::string& ,
725 static_cast<void>(ex);
726 if (allow_exceptions)
733 constexpr bool is_errored()
const
740#if JSON_DIAGNOSTIC_POSITIONS
741 void handle_diagnostic_positions_for_json_value(BasicJsonType& v)
748 v.end_position = m_lexer_ref->get_position();
755 v.start_position = v.end_position - (v.m_data.m_value.boolean ? 4 : 5);
762 v.start_position = v.end_position - 4;
769 v.start_position = v.end_position - v.m_data.m_value.string->size() - 2;
775 v.end_position = std::string::npos;
776 v.start_position = v.end_position;
785 v.start_position = v.end_position - m_lexer_ref->get_string().size();
819 template<
typename Value>
820 std::pair<bool, BasicJsonType*> handle_value(Value&& v,
const bool skip_callback =
false)
822 JSON_ASSERT(!keep_stack.empty());
826 if (!keep_stack.back())
828 return {
false,
nullptr};
832 auto value = BasicJsonType(std::forward<Value>(v));
834#if JSON_DIAGNOSTIC_POSITIONS
835 handle_diagnostic_positions_for_json_value(value);
839 const bool keep = skip_callback || callback(
static_cast<int>(ref_stack.size()),
parse_event_t::value, value);
844 return {
false,
nullptr};
847 if (ref_stack.empty())
849 root = std::move(value);
850 return {
true, & root};
855 if (!ref_stack.back())
857 return {
false,
nullptr};
861 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
864 if (ref_stack.back()->is_array())
866 ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));
867 return {
true, & (ref_stack.back()->m_data.m_value.array->back())};
871 JSON_ASSERT(ref_stack.back()->is_object());
873 JSON_ASSERT(!key_keep_stack.empty());
874 const bool store_element = key_keep_stack.back();
875 key_keep_stack.pop_back();
879 return {
false,
nullptr};
882 JSON_ASSERT(object_element);
883 *object_element = std::move(value);
884 return {
true, object_element};
890 std::vector<BasicJsonType*> ref_stack {};
892 std::vector<bool> keep_stack {};
894 std::vector<bool> key_keep_stack {};
896 BasicJsonType* object_element =
nullptr;
898 bool errored =
false;
900 const parser_callback_t callback =
nullptr;
902 const bool allow_exceptions =
true;
904 BasicJsonType discarded = BasicJsonType::value_t::discarded;
906 lexer_t* m_lexer_ref =
nullptr;