8 #include <nlohmann/detail/exceptions.hpp>
9 #include <nlohmann/detail/macro_scope.hpp>
22 template<
typename BasicJsonType>
25 using number_integer_t =
typename BasicJsonType::number_integer_t;
26 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
27 using number_float_t =
typename BasicJsonType::number_float_t;
28 using string_t =
typename BasicJsonType::string_t;
29 using binary_t =
typename BasicJsonType::binary_t;
35 virtual bool null() = 0;
64 virtual bool number_float(number_float_t val,
const string_t& s) = 0;
72 virtual bool string(string_t& val) = 0;
80 virtual bool binary(binary_t& val) = 0;
96 virtual bool key(string_t& val) = 0;
126 const std::string& last_token,
153 template<
typename BasicJsonType>
157 using number_integer_t =
typename BasicJsonType::number_integer_t;
158 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
159 using number_float_t =
typename BasicJsonType::number_float_t;
160 using string_t =
typename BasicJsonType::string_t;
161 using binary_t =
typename BasicJsonType::binary_t;
169 : root(r), allow_exceptions(allow_exceptions_)
181 handle_value(
nullptr);
209 bool string(string_t& val)
215 bool binary(binary_t& val)
217 handle_value(std::move(val));
223 ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
225 if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
227 JSON_THROW(out_of_range::create(408,
"excessive object size: " + std::to_string(len), *ref_stack.back()));
233 bool key(string_t& val)
236 object_element = &(ref_stack.back()->m_value.object->operator[](val));
242 ref_stack.back()->set_parents();
243 ref_stack.pop_back();
249 ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
251 if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
253 JSON_THROW(out_of_range::create(408,
"excessive array size: " + std::to_string(len), *ref_stack.back()));
261 ref_stack.back()->set_parents();
262 ref_stack.pop_back();
266 template<
class Exception>
267 bool parse_error(std::size_t ,
const std::string& ,
271 static_cast<void>(ex);
272 if (allow_exceptions)
279 constexpr
bool is_errored()
const
291 template<
typename Value>
292 JSON_HEDLEY_RETURNS_NON_NULL
293 BasicJsonType* handle_value(Value&& v)
295 if (ref_stack.empty())
297 root = BasicJsonType(std::forward<Value>(v));
301 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
303 if (ref_stack.back()->is_array())
305 ref_stack.back()->m_value.array->emplace_back(std::forward<Value>(v));
306 return &(ref_stack.back()->m_value.array->back());
309 JSON_ASSERT(ref_stack.back()->is_object());
310 JSON_ASSERT(object_element);
311 *object_element = BasicJsonType(std::forward<Value>(v));
312 return object_element;
318 std::vector<BasicJsonType*> ref_stack {};
320 BasicJsonType* object_element =
nullptr;
322 bool errored =
false;
324 const bool allow_exceptions =
true;
327 template<
typename BasicJsonType>
331 using number_integer_t =
typename BasicJsonType::number_integer_t;
332 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
333 using number_float_t =
typename BasicJsonType::number_float_t;
334 using string_t =
typename BasicJsonType::string_t;
335 using binary_t =
typename BasicJsonType::binary_t;
336 using parser_callback_t =
typename BasicJsonType::parser_callback_t;
337 using parse_event_t =
typename BasicJsonType::parse_event_t;
340 const parser_callback_t cb,
341 const bool allow_exceptions_ =
true)
342 : root(r), callback(cb), allow_exceptions(allow_exceptions_)
344 keep_stack.push_back(
true);
356 handle_value(
nullptr);
384 bool string(string_t& val)
390 bool binary(binary_t& val)
392 handle_value(std::move(val));
399 const bool keep = callback(
static_cast<int>(ref_stack.size()), parse_event_t::object_start,
discarded);
400 keep_stack.push_back(keep);
402 auto val = handle_value(BasicJsonType::value_t::object,
true);
403 ref_stack.push_back(val.second);
406 if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
408 JSON_THROW(out_of_range::create(408,
"excessive object size: " + std::to_string(len), *ref_stack.back()));
414 bool key(string_t& val)
416 BasicJsonType k = BasicJsonType(val);
419 const bool keep = callback(
static_cast<int>(ref_stack.size()), parse_event_t::key, k);
420 key_keep_stack.push_back(keep);
423 if (keep && ref_stack.back())
425 object_element = &(ref_stack.back()->m_value.object->operator[](val) =
discarded);
433 if (ref_stack.back())
435 if (!callback(
static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back()))
442 ref_stack.back()->set_parents();
446 JSON_ASSERT(!ref_stack.empty());
447 JSON_ASSERT(!keep_stack.empty());
448 ref_stack.pop_back();
449 keep_stack.pop_back();
451 if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured())
454 for (
auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)
456 if (it->is_discarded())
458 ref_stack.back()->erase(it);
469 const bool keep = callback(
static_cast<int>(ref_stack.size()), parse_event_t::array_start,
discarded);
470 keep_stack.push_back(keep);
472 auto val = handle_value(BasicJsonType::value_t::array,
true);
473 ref_stack.push_back(val.second);
476 if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size()))
478 JSON_THROW(out_of_range::create(408,
"excessive array size: " + std::to_string(len), *ref_stack.back()));
488 if (ref_stack.back())
490 keep = callback(
static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());
493 ref_stack.back()->set_parents();
502 JSON_ASSERT(!ref_stack.empty());
503 JSON_ASSERT(!keep_stack.empty());
504 ref_stack.pop_back();
505 keep_stack.pop_back();
508 if (!keep && !ref_stack.empty() && ref_stack.back()->is_array())
510 ref_stack.back()->m_value.array->pop_back();
516 template<
class Exception>
517 bool parse_error(std::size_t ,
const std::string& ,
521 static_cast<void>(ex);
522 if (allow_exceptions)
529 constexpr
bool is_errored()
const
550 template<
typename Value>
551 std::pair<bool, BasicJsonType*> handle_value(Value&& v,
const bool skip_callback =
false)
553 JSON_ASSERT(!keep_stack.empty());
557 if (!keep_stack.back())
559 return {
false,
nullptr};
563 auto value = BasicJsonType(std::forward<Value>(v));
566 const bool keep = skip_callback || callback(
static_cast<int>(ref_stack.size()), parse_event_t::value,
value);
571 return {
false,
nullptr};
574 if (ref_stack.empty())
576 root = std::move(
value);
577 return {
true, &root};
582 if (!ref_stack.back())
584 return {
false,
nullptr};
588 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
591 if (ref_stack.back()->is_array())
593 ref_stack.back()->m_value.array->emplace_back(std::move(
value));
594 return {
true, &(ref_stack.back()->m_value.array->back())};
598 JSON_ASSERT(ref_stack.back()->is_object());
600 JSON_ASSERT(!key_keep_stack.empty());
601 const bool store_element = key_keep_stack.back();
602 key_keep_stack.pop_back();
606 return {
false,
nullptr};
609 JSON_ASSERT(object_element);
610 *object_element = std::move(
value);
611 return {
true, object_element};
617 std::vector<BasicJsonType*> ref_stack {};
619 std::vector<bool> keep_stack {};
621 std::vector<bool> key_keep_stack {};
623 BasicJsonType* object_element =
nullptr;
625 bool errored =
false;
627 const parser_callback_t callback =
nullptr;
629 const bool allow_exceptions =
true;
631 BasicJsonType
discarded = BasicJsonType::value_t::discarded;
634 template<
typename BasicJsonType>
638 using number_integer_t =
typename BasicJsonType::number_integer_t;
639 using number_unsigned_t =
typename BasicJsonType::number_unsigned_t;
640 using number_float_t =
typename BasicJsonType::number_float_t;
641 using string_t =
typename BasicJsonType::string_t;
642 using binary_t =
typename BasicJsonType::binary_t;
general exception of the basic_json class
Definition: exceptions.hpp:50
Definition: json_sax.hpp:636
Definition: json_sax.hpp:329
SAX implementation to create a JSON value from SAX events.
Definition: json_sax.hpp:155
json_sax_dom_parser(BasicJsonType &r, const bool allow_exceptions_=true)
Definition: json_sax.hpp:168
@ discarded
discarded by the parser callback function
@ value
the parser finished reading a JSON value
namespace for Niels Lohmann
Definition: adl_serializer.hpp:12
SAX interface.
Definition: json_sax.hpp:24
virtual bool start_object(std::size_t elements)=0
the beginning of an object was read
virtual bool string(string_t &val)=0
a string was read
virtual bool end_array()=0
the end of an array was read
virtual bool key(string_t &val)=0
an object key was read
virtual bool binary(binary_t &val)=0
a binary string was read
virtual bool start_array(std::size_t elements)=0
the beginning of an array was read
virtual bool parse_error(std::size_t position, const std::string &last_token, const detail::exception &ex)=0
a parse error occurred
virtual bool boolean(bool val)=0
a boolean value was read
virtual bool end_object()=0
the end of an object was read
virtual bool number_unsigned(number_unsigned_t val)=0
an unsigned integer number was read
virtual bool number_float(number_float_t val, const string_t &s)=0
an floating-point number was read
virtual bool number_integer(number_integer_t val)=0
an integer number was read