extended "add" to cope with arrays

This commit is contained in:
Niels 2016-04-24 16:51:06 +02:00
parent 397ada22d3
commit 855cf2307b
3 changed files with 65 additions and 3 deletions

View file

@ -9560,7 +9560,25 @@ basic_json_parser_63:
throw std::domain_error("'add' operation must have member 'value'"); throw std::domain_error("'add' operation must have member 'value'");
} }
result[ptr] = it_value->second; const auto last_path = ptr.pop_back();
basic_json& parent = result.at(ptr);
if (parent.is_object())
{
parent[last_path] = it_value->second;
}
else if (parent.is_array())
{
if (last_path == "-")
{
parent.push_back(it_value->second);
}
else
{
parent.insert(parent.begin() + std::stoi(last_path),
it_value->second);
}
}
} }
else if (op == "remove") else if (op == "remove")
{ {

View file

@ -8870,7 +8870,25 @@ class basic_json
throw std::domain_error("'add' operation must have member 'value'"); throw std::domain_error("'add' operation must have member 'value'");
} }
result[ptr] = it_value->second; const auto last_path = ptr.pop_back();
basic_json& parent = result.at(ptr);
if (parent.is_object())
{
parent[last_path] = it_value->second;
}
else if (parent.is_array())
{
if (last_path == "-")
{
parent.push_back(it_value->second);
}
else
{
parent.insert(parent.begin() + std::stoi(last_path),
it_value->second);
}
}
} }
else if (op == "remove") else if (op == "remove")
{ {

View file

@ -12421,6 +12421,29 @@ TEST_CASE("JSON patch")
CHECK(doc.apply_patch(patch) == expected); CHECK(doc.apply_patch(patch) == expected);
} }
SECTION("example A.2 - Adding an Array Element")
{
// An example target JSON document:
json doc = R"(
{ "foo": [ "bar", "baz" ] }
)"_json;
// A JSON Patch document:
json patch = R"(
[
{ "op": "add", "path": "/foo/1", "value": "qux" }
]
)"_json;
// The resulting JSON document:
json expected = R"(
{ "foo": [ "bar", "qux", "baz" ] }
)"_json;
// check if patched value is as expected
CHECK(doc.apply_patch(patch) == expected);
}
SECTION("example A.3 - Removing an Object Member") SECTION("example A.3 - Removing an Object Member")
{ {
// An example target JSON document: // An example target JSON document:
@ -12616,9 +12639,12 @@ TEST_CASE("JSON patch")
// an existing object, nor a member of an existing array. // an existing object, nor a member of an existing array.
CHECK_THROWS_AS(doc.apply_patch(patch), std::out_of_range); CHECK_THROWS_AS(doc.apply_patch(patch), std::out_of_range);
CHECK_THROWS_WITH(doc.apply_patch(patch), "unresolved reference token 'bat'"); CHECK_THROWS_WITH(doc.apply_patch(patch), "key 'baz' not found");
} }
// A.13. Invalid JSON Patch Document
// not applicable
SECTION("example A.14 - Escape Ordering") SECTION("example A.14 - Escape Ordering")
{ {
// An example target JSON document: // An example target JSON document: