diff --git a/include/nlohmann/detail/input/json_sax.hpp b/include/nlohmann/detail/input/json_sax.hpp index 25be7e4b..66b08bff 100644 --- a/include/nlohmann/detail/input/json_sax.hpp +++ b/include/nlohmann/detail/input/json_sax.hpp @@ -452,7 +452,7 @@ class json_sax_dom_callback_parser ref_stack.pop_back(); keep_stack.pop_back(); - if (not ref_stack.empty() and ref_stack.back() and ref_stack.back()->is_object()) + if (not ref_stack.empty() and ref_stack.back() and ref_stack.back()->is_structured()) { // remove discarded value for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 7a1aacb5..03510741 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -5358,7 +5358,7 @@ class json_sax_dom_callback_parser ref_stack.pop_back(); keep_stack.pop_back(); - if (not ref_stack.empty() and ref_stack.back() and ref_stack.back()->is_object()) + if (not ref_stack.empty() and ref_stack.back() and ref_stack.back()->is_structured()) { // remove discarded value for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index d43099f2..eb2fc9ff 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -1489,6 +1489,18 @@ TEST_CASE("parser class") [1,2,[3,4,5],4,5] )"; + auto structured_array = R"( + [ + 1, + { + "foo": "bar" + }, + { + "qux": "baz" + } + ] + )"; + SECTION("filter nothing") { json j_object = json::parse(s_object, [](int, json::parse_event_t, const json&) @@ -1557,6 +1569,41 @@ TEST_CASE("parser class") CHECK (j_array == json({1, {3, 4, 5}, 4, 5})); } + SECTION("filter object in array") + { + json j_filtered1 = json::parse(structured_array, [](int, json::parse_event_t e, const json & parsed) + { + if (e == json::parse_event_t::object_end and parsed.contains("foo")) + { + return false; + } + else + { + return true; + } + }); + + // the specified object will be discarded, and removed. + CHECK (j_filtered1.size() == 2); + CHECK (j_filtered1 == json({1, {{"qux", "baz"}}})); + + json j_filtered2 = json::parse(structured_array, [](int, json::parse_event_t e, const json & parsed) + { + if (e == json::parse_event_t::object_end) + { + return false; + } + else + { + return true; + } + }); + + // removed all objects in array. + CHECK (j_filtered2.size() == 1); + CHECK (j_filtered2 == json({1})); + } + SECTION("filter specific events") { SECTION("first closing event")