diff --git a/src/json.hpp b/src/json.hpp index cc6f94cf..ddb6e6dd 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -291,12 +291,6 @@ class basic_json using parser_callback_t = std::function; - /// default parser callback returns true to keep all elements - static bool default_callback(int, parse_event_t, const basic_json&) - { - return true; - } - /*! @brief comparison operator for JSON value types @@ -1994,13 +1988,13 @@ class basic_json ///////////////////// /// deserialize from string - static basic_json parse(const string_t& s, parser_callback_t cb = default_callback) + static basic_json parse(const string_t& s, parser_callback_t cb = nullptr) { return parser(s, cb).parse(); } /// deserialize from stream - static basic_json parse(std::istream& i, parser_callback_t cb = default_callback) + static basic_json parse(std::istream& i, parser_callback_t cb = nullptr) { return parser(i, cb).parse(); } @@ -4579,14 +4573,14 @@ basic_json_parser_59: { public: /// constructor for strings - inline parser(const string_t& s, parser_callback_t cb = default_callback) : callback(cb), m_lexer(s) + inline parser(const string_t& s, parser_callback_t cb = nullptr) : callback(cb), m_lexer(s) { // read first token get_token(); } /// a parser reading from an input stream - inline parser(std::istream& _is, parser_callback_t cb = default_callback) : callback(cb), + inline parser(std::istream& _is, parser_callback_t cb = nullptr) : callback(cb), m_lexer(&_is) { // read first token @@ -4613,7 +4607,7 @@ basic_json_parser_59: { case (lexer::token_type::begin_object): { - if (keep and (keep = callback(depth++, parse_event_t::object_start, result))) + if (keep and (not callback or (keep = callback(depth++, parse_event_t::object_start, result)))) { // explicitly set result to object to cope with {} result.m_type = value_t::object; @@ -4627,7 +4621,7 @@ basic_json_parser_59: if (last_token == lexer::token_type::end_object) { get_token(); - if (keep and not (keep = callback(--depth, parse_event_t::object_end, result))) + if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) { result = basic_json(value_t::discarded); } @@ -4653,7 +4647,7 @@ basic_json_parser_59: bool keep_tag = false; if (keep) { - keep_tag = callback(depth, parse_event_t::key, basic_json(key)); + keep_tag = callback ? callback(depth, parse_event_t::key, basic_json(key)) : true; } // parse separator (:) @@ -4673,7 +4667,7 @@ basic_json_parser_59: // closing } expect(lexer::token_type::end_object); get_token(); - if (keep and not callback(--depth, parse_event_t::object_end, result)) + if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) { result = basic_json(value_t::discarded); } @@ -4683,7 +4677,7 @@ basic_json_parser_59: case (lexer::token_type::begin_array): { - if (keep and (keep = callback(depth++, parse_event_t::array_start, result))) + if (keep and (not callback or (keep = callback(depth++, parse_event_t::array_start, result)))) { // explicitly set result to object to cope with [] result.m_type = value_t::array; @@ -4697,7 +4691,7 @@ basic_json_parser_59: if (last_token == lexer::token_type::end_array) { get_token(); - if (not callback(--depth, parse_event_t::array_end, result)) + if (callback and not callback(--depth, parse_event_t::array_end, result)) { result = basic_json(value_t::discarded); } @@ -4728,7 +4722,7 @@ basic_json_parser_59: // closing ] expect(lexer::token_type::end_array); get_token(); - if (keep and not callback(--depth, parse_event_t::array_end, result)) + if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) { result = basic_json(value_t::discarded); } @@ -4805,7 +4799,7 @@ basic_json_parser_59: } } - if (keep and not callback(depth, parse_event_t::value, result)) + if (keep and callback and not callback(depth, parse_event_t::value, result)) { result = basic_json(value_t::discarded); } diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index d7c7d038..88ed552d 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -3953,7 +3953,7 @@ class basic_json bool keep_tag = false; if (keep) { - keep_tag = callback ? callback(depth, parse_event_t::key, basic_json(key)) : true; + keep_tag = callback ? callback(depth, parse_event_t::key, basic_json(key)) : true; } // parse separator (:)