From 4350c5ed97df7621a2fd32b973180ef3efbb41d8 Mon Sep 17 00:00:00 2001 From: chenguoping Date: Sat, 30 May 2020 17:15:56 +0800 Subject: [PATCH 1/2] fix bug in issue#1972 --- include/nlohmann/detail/input/json_sax.hpp | 2 +- single_include/nlohmann/json.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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) From 8cd39578e332384a9d8546543ebfc5d660e50d43 Mon Sep 17 00:00:00 2001 From: chenguoping Date: Mon, 1 Jun 2020 11:34:03 +0800 Subject: [PATCH 2/2] add test case --- test/src/unit-class_parser.cpp | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) 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")