Merge pull request #2153 from dota17/issue#1972

Fix issue#1972
This commit is contained in:
Niels Lohmann 2020-06-03 12:26:17 +02:00 committed by GitHub
commit 309acb445a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 2 deletions

View file

@ -452,7 +452,7 @@ class json_sax_dom_callback_parser
ref_stack.pop_back(); ref_stack.pop_back();
keep_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 // remove discarded value
for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)

View file

@ -5358,7 +5358,7 @@ class json_sax_dom_callback_parser
ref_stack.pop_back(); ref_stack.pop_back();
keep_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 // remove discarded value
for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)

View file

@ -1489,6 +1489,18 @@ TEST_CASE("parser class")
[1,2,[3,4,5],4,5] [1,2,[3,4,5],4,5]
)"; )";
auto structured_array = R"(
[
1,
{
"foo": "bar"
},
{
"qux": "baz"
}
]
)";
SECTION("filter nothing") SECTION("filter nothing")
{ {
json j_object = json::parse(s_object, [](int, json::parse_event_t, const json&) 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})); 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("filter specific events")
{ {
SECTION("first closing event") SECTION("first closing event")