implemented remove
This commit is contained in:
parent
fa03cf0c63
commit
397ada22d3
3 changed files with 97 additions and 4 deletions
26
src/json.hpp
26
src/json.hpp
|
@ -8969,6 +8969,18 @@ basic_json_parser_63:
|
||||||
: reference_tokens(split(s))
|
: reference_tokens(split(s))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
std::string pop_back()
|
||||||
|
{
|
||||||
|
if (reference_tokens.empty())
|
||||||
|
{
|
||||||
|
throw std::domain_error("JSON pointer has no parent");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto last = reference_tokens.back();
|
||||||
|
reference_tokens.pop_back();
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*!
|
/*!
|
||||||
@brief create and return a reference to the pointed to value
|
@brief create and return a reference to the pointed to value
|
||||||
|
@ -9420,7 +9432,7 @@ basic_json_parser_63:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// the reference tokens
|
/// the reference tokens
|
||||||
const std::vector<std::string> reference_tokens {};
|
std::vector<std::string> reference_tokens {};
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////
|
////////////////////////////
|
||||||
|
@ -9539,7 +9551,7 @@ basic_json_parser_63:
|
||||||
|
|
||||||
const std::string op = it_op->second;
|
const std::string op = it_op->second;
|
||||||
const std::string path = it_path->second;
|
const std::string path = it_path->second;
|
||||||
const json_pointer ptr(path);
|
json_pointer ptr(path);
|
||||||
|
|
||||||
if (op == "add")
|
if (op == "add")
|
||||||
{
|
{
|
||||||
|
@ -9552,6 +9564,16 @@ basic_json_parser_63:
|
||||||
}
|
}
|
||||||
else if (op == "remove")
|
else if (op == "remove")
|
||||||
{
|
{
|
||||||
|
const auto last_path = ptr.pop_back();
|
||||||
|
basic_json& parent = result.at(ptr);
|
||||||
|
if (parent.is_object())
|
||||||
|
{
|
||||||
|
parent.erase(parent.find(last_path));
|
||||||
|
}
|
||||||
|
else if (parent.is_array())
|
||||||
|
{
|
||||||
|
parent.erase(parent.begin() + std::stoi(last_path));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (op == "replace")
|
else if (op == "replace")
|
||||||
{
|
{
|
||||||
|
|
|
@ -8279,6 +8279,18 @@ class basic_json
|
||||||
: reference_tokens(split(s))
|
: reference_tokens(split(s))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
std::string pop_back()
|
||||||
|
{
|
||||||
|
if (reference_tokens.empty())
|
||||||
|
{
|
||||||
|
throw std::domain_error("JSON pointer has no parent");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto last = reference_tokens.back();
|
||||||
|
reference_tokens.pop_back();
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*!
|
/*!
|
||||||
@brief create and return a reference to the pointed to value
|
@brief create and return a reference to the pointed to value
|
||||||
|
@ -8730,7 +8742,7 @@ class basic_json
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// the reference tokens
|
/// the reference tokens
|
||||||
const std::vector<std::string> reference_tokens {};
|
std::vector<std::string> reference_tokens {};
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////
|
////////////////////////////
|
||||||
|
@ -8849,7 +8861,7 @@ class basic_json
|
||||||
|
|
||||||
const std::string op = it_op->second;
|
const std::string op = it_op->second;
|
||||||
const std::string path = it_path->second;
|
const std::string path = it_path->second;
|
||||||
const json_pointer ptr(path);
|
json_pointer ptr(path);
|
||||||
|
|
||||||
if (op == "add")
|
if (op == "add")
|
||||||
{
|
{
|
||||||
|
@ -8862,6 +8874,16 @@ class basic_json
|
||||||
}
|
}
|
||||||
else if (op == "remove")
|
else if (op == "remove")
|
||||||
{
|
{
|
||||||
|
const auto last_path = ptr.pop_back();
|
||||||
|
basic_json& parent = result.at(ptr);
|
||||||
|
if (parent.is_object())
|
||||||
|
{
|
||||||
|
parent.erase(parent.find(last_path));
|
||||||
|
}
|
||||||
|
else if (parent.is_array())
|
||||||
|
{
|
||||||
|
parent.erase(parent.begin() + std::stoi(last_path));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (op == "replace")
|
else if (op == "replace")
|
||||||
{
|
{
|
||||||
|
|
|
@ -12421,6 +12421,55 @@ TEST_CASE("JSON patch")
|
||||||
CHECK(doc.apply_patch(patch) == expected);
|
CHECK(doc.apply_patch(patch) == expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("example A.3 - Removing an Object Member")
|
||||||
|
{
|
||||||
|
// An example target JSON document:
|
||||||
|
json doc = R"(
|
||||||
|
{
|
||||||
|
"baz": "qux",
|
||||||
|
"foo": "bar"
|
||||||
|
}
|
||||||
|
)"_json;
|
||||||
|
|
||||||
|
// A JSON Patch document:
|
||||||
|
json patch = R"(
|
||||||
|
[
|
||||||
|
{ "op": "remove", "path": "/baz" }
|
||||||
|
]
|
||||||
|
)"_json;
|
||||||
|
|
||||||
|
// The resulting JSON document:
|
||||||
|
json expected = R"(
|
||||||
|
{ "foo": "bar" }
|
||||||
|
)"_json;
|
||||||
|
|
||||||
|
// check if patched value is as expected
|
||||||
|
CHECK(doc.apply_patch(patch) == expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("example A.4 - Removing an Array Element")
|
||||||
|
{
|
||||||
|
// An example target JSON document:
|
||||||
|
json doc = R"(
|
||||||
|
{ "foo": [ "bar", "qux", "baz" ] }
|
||||||
|
)"_json;
|
||||||
|
|
||||||
|
// A JSON Patch document:
|
||||||
|
json patch = R"(
|
||||||
|
[
|
||||||
|
{ "op": "remove", "path": "/foo/1" }
|
||||||
|
]
|
||||||
|
)"_json;
|
||||||
|
|
||||||
|
// The resulting JSON document:
|
||||||
|
json expected = R"(
|
||||||
|
{ "foo": [ "bar", "baz" ] }
|
||||||
|
)"_json;
|
||||||
|
|
||||||
|
// check if patched value is as expected
|
||||||
|
CHECK(doc.apply_patch(patch) == expected);
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("example A.5 - Replacing a Value")
|
SECTION("example A.5 - Replacing a Value")
|
||||||
{
|
{
|
||||||
// An example target JSON document:
|
// An example target JSON document:
|
||||||
|
|
Loading…
Reference in a new issue