diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp
index 8346cd4b..32f2be88 100644
--- a/include/nlohmann/detail/input/parser.hpp
+++ b/include/nlohmann/detail/input/parser.hpp
@@ -164,6 +164,8 @@ class parser
     {
         // never parse after a parse error was detected
         assert(not errored);
+        // this function is only called when a callback is given
+        assert(callback);
 
         // start with a discarded value
         if (not result.is_discarded())
@@ -178,12 +180,9 @@ class parser
             {
                 if (keep)
                 {
-                    if (callback)
-                    {
-                        keep = callback(depth++, parse_event_t::object_start, result);
-                    }
+                    keep = callback(depth++, parse_event_t::object_start, result);
 
-                    if (not callback or keep)
+                    if (keep)
                     {
                         // explicitly set result to object to cope with {}
                         result.m_type = value_t::object;
@@ -197,7 +196,7 @@ class parser
                 // closing } -> we are done
                 if (last_token == token_type::end_object)
                 {
-                    if (keep and callback and not callback(--depth, parse_event_t::object_end, result))
+                    if (keep and not callback(--depth, parse_event_t::object_end, result))
                     {
                         result.m_value.destroy(result.m_type);
                         result.m_type = value_t::discarded;
@@ -220,15 +219,8 @@ class parser
                     bool keep_tag = false;
                     if (keep)
                     {
-                        if (callback)
-                        {
-                            BasicJsonType k(key);
-                            keep_tag = callback(depth, parse_event_t::key, k);
-                        }
-                        else
-                        {
-                            keep_tag = true;
-                        }
+                        BasicJsonType k(key);
+                        keep_tag = callback(depth, parse_event_t::key, k);
                     }
 
                     // parse separator (:)
@@ -270,7 +262,7 @@ class parser
                     break;
                 }
 
-                if (keep and callback and not callback(--depth, parse_event_t::object_end, result))
+                if (keep and not callback(--depth, parse_event_t::object_end, result))
                 {
                     result.m_value.destroy(result.m_type);
                     result.m_type = value_t::discarded;
@@ -282,12 +274,9 @@ class parser
             {
                 if (keep)
                 {
-                    if (callback)
-                    {
-                        keep = callback(depth++, parse_event_t::array_start, result);
-                    }
+                    keep = callback(depth++, parse_event_t::array_start, result);
 
-                    if (not callback or keep)
+                    if (keep)
                     {
                         // explicitly set result to array to cope with []
                         result.m_type = value_t::array;
@@ -301,7 +290,7 @@ class parser
                 // closing ] -> we are done
                 if (last_token == token_type::end_array)
                 {
-                    if (callback and not callback(--depth, parse_event_t::array_end, result))
+                    if (not callback(--depth, parse_event_t::array_end, result))
                     {
                         result.m_value.destroy(result.m_type);
                         result.m_type = value_t::discarded;
@@ -344,7 +333,7 @@ class parser
                     break;
                 }
 
-                if (keep and callback and not callback(--depth, parse_event_t::array_end, result))
+                if (keep and not callback(--depth, parse_event_t::array_end, result))
                 {
                     result.m_value.destroy(result.m_type);
                     result.m_type = value_t::discarded;
@@ -432,7 +421,7 @@ class parser
             }
         }
 
-        if (keep and callback and not callback(depth, parse_event_t::value, result))
+        if (keep and not callback(depth, parse_event_t::value, result))
         {
             result.m_value.destroy(result.m_type);
             result.m_type = value_t::discarded;
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index cdd55475..666150d9 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -3641,6 +3641,8 @@ class parser
     {
         // never parse after a parse error was detected
         assert(not errored);
+        // this function is only called when a callback is given
+        assert(callback);
 
         // start with a discarded value
         if (not result.is_discarded())
@@ -3655,12 +3657,9 @@ class parser
             {
                 if (keep)
                 {
-                    if (callback)
-                    {
-                        keep = callback(depth++, parse_event_t::object_start, result);
-                    }
+                    keep = callback(depth++, parse_event_t::object_start, result);
 
-                    if (not callback or keep)
+                    if (keep)
                     {
                         // explicitly set result to object to cope with {}
                         result.m_type = value_t::object;
@@ -3674,7 +3673,7 @@ class parser
                 // closing } -> we are done
                 if (last_token == token_type::end_object)
                 {
-                    if (keep and callback and not callback(--depth, parse_event_t::object_end, result))
+                    if (keep and not callback(--depth, parse_event_t::object_end, result))
                     {
                         result.m_value.destroy(result.m_type);
                         result.m_type = value_t::discarded;
@@ -3697,15 +3696,8 @@ class parser
                     bool keep_tag = false;
                     if (keep)
                     {
-                        if (callback)
-                        {
-                            BasicJsonType k(key);
-                            keep_tag = callback(depth, parse_event_t::key, k);
-                        }
-                        else
-                        {
-                            keep_tag = true;
-                        }
+                        BasicJsonType k(key);
+                        keep_tag = callback(depth, parse_event_t::key, k);
                     }
 
                     // parse separator (:)
@@ -3747,7 +3739,7 @@ class parser
                     break;
                 }
 
-                if (keep and callback and not callback(--depth, parse_event_t::object_end, result))
+                if (keep and not callback(--depth, parse_event_t::object_end, result))
                 {
                     result.m_value.destroy(result.m_type);
                     result.m_type = value_t::discarded;
@@ -3759,12 +3751,9 @@ class parser
             {
                 if (keep)
                 {
-                    if (callback)
-                    {
-                        keep = callback(depth++, parse_event_t::array_start, result);
-                    }
+                    keep = callback(depth++, parse_event_t::array_start, result);
 
-                    if (not callback or keep)
+                    if (keep)
                     {
                         // explicitly set result to array to cope with []
                         result.m_type = value_t::array;
@@ -3778,7 +3767,7 @@ class parser
                 // closing ] -> we are done
                 if (last_token == token_type::end_array)
                 {
-                    if (callback and not callback(--depth, parse_event_t::array_end, result))
+                    if (not callback(--depth, parse_event_t::array_end, result))
                     {
                         result.m_value.destroy(result.m_type);
                         result.m_type = value_t::discarded;
@@ -3821,7 +3810,7 @@ class parser
                     break;
                 }
 
-                if (keep and callback and not callback(--depth, parse_event_t::array_end, result))
+                if (keep and not callback(--depth, parse_event_t::array_end, result))
                 {
                     result.m_value.destroy(result.m_type);
                     result.m_type = value_t::discarded;
@@ -3909,7 +3898,7 @@ class parser
             }
         }
 
-        if (keep and callback and not callback(depth, parse_event_t::value, result))
+        if (keep and not callback(depth, parse_event_t::value, result))
         {
             result.m_value.destroy(result.m_type);
             result.m_type = value_t::discarded;
diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp
index 39753d68..d84148eb 100644
--- a/test/src/unit-class_parser.cpp
+++ b/test/src/unit-class_parser.cpp
@@ -176,7 +176,18 @@ bool accept_helper(const std::string& s)
     CHECK_NOTHROW(json::sax_parse(s, &el));
     CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept(false) == not el.errored);
 
-    // 5. return result
+    // 5. parse with simple callback
+    json::parser_callback_t cb = [](int, json::parse_event_t, json&)
+    {
+        return true;
+    };
+    json j_cb = json::parse(s, cb, false);
+    const bool ok_noexcept_cb = not j_cb.is_discarded();
+
+    // 6. check if this approach came to the same result
+    CHECK(ok_noexcept == ok_noexcept_cb);
+
+    // 7. return result
     return ok_accept;
 }