diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index ec484860..d7c7d038 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -291,12 +291,6 @@ class basic_json
     using parser_callback_t = std::function<bool(int depth, parse_event_t event,
                               const basic_json& parsed)>;
 
-    /// 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();
     }
@@ -3885,14 +3879,14 @@ class basic_json
     {
       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
@@ -3919,7 +3913,7 @@ class basic_json
             {
                 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;
@@ -3933,7 +3927,7 @@ class basic_json
                     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);
                         }
@@ -3959,7 +3953,7 @@ class basic_json
                         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 (:)
@@ -3979,7 +3973,7 @@ class basic_json
                     // 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);
                     }
@@ -3989,7 +3983,7 @@ class basic_json
 
                 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;
@@ -4003,7 +3997,7 @@ class basic_json
                     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);
                         }
@@ -4034,7 +4028,7 @@ class basic_json
                     // 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);
                     }
@@ -4111,7 +4105,7 @@ class basic_json
                 }
             }
 
-            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);
             }