Adds a value to an object or inserts it into an array at the target location, if a value does not already exist at that location.
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
template<class Json, class T>
void add_if_absent(Json& target,
const basic_json_pointer<Json::char_type>& location,
T&& value,
bool create_if_missing = false); (1)
template<class Json, class T>
void add_if_absent(Json& target,
const basic_json_pointer<Json::char_type>& location,
T&& value,
std::error_code& ec); (2)
template<class Json, class T>
void add_if_absent(Json& target,
const basic_json_pointer<Json::char_type>& location,
T&& value,
bool create_if_missing,
std::error_code& ec); (3)
template<class Json, class StringSource, class T>
void add_if_absent(Json& target,
const StringSource& location_str,
T&& value,
bool create_if_missing = false); (4)
template<class Json, class StringSource, class T>
void add_if_absent(Json& target,
const StringSource& location_str,
T&& value,
std::error_code& ec); (5)
template<class Json, class StringSource, class T>
void add_if_absent(Json& target,
const StringSource& location_str,
T&& value,
bool create_if_missing,
std::error_code& ec); (6)
Inserts a value into the target at the specified location, if the location doesn't specify an object member that already has the same key.
-
If
location
specifies an array index, a new value is inserted into the array at the specified index. -
If
location
specifies an object member that does not already exist, a new member is added to the object.
target | JSON value |
location | A basic_json_pointer |
location_str | A JSON Pointer provided as a string, string view, or C-string |
value | New value |
create_if_missing (since 0.162.0) |
Create key-object pairs when object key is missing |
ec |
out-parameter for reporting errors in the non-throwing overload |
None
(1) Throws a jsonpointer_error if add_if_absent
fails.
(2) Sets the out-parameter ec
to the jsonpointer_error_category if add_if_absent
fails.
#include <jsoncons/json.hpp>
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
// for brevity
using jsoncons::json;
namespace jsonpointer = jsoncons::jsonpointer;
int main()
{
auto target = json::parse(R"(
{ "foo": "bar"}
)");
std::error_code ec;
jsonpointer::add_if_absent(target, "/baz", json("qux"), ec);
if (ec)
{
std::cout << ec.message() << std::endl;
}
else
{
std::cout << target << std::endl;
}
}
Output:
{"baz":"qux","foo":"bar"}
#include <jsoncons/json.hpp>
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
using jsoncons::json;
namespace jsonpointer = jsoncons::jsonpointer;
int main()
{
auto target = json::parse(R"(
{ "foo": [ "bar", "baz" ] }
)");
std::error_code ec;
jsonpointer::add_if_absent(target, "/foo/1", json("qux"), ec);
if (ec)
{
std::cout << ec.message() << std::endl;
}
else
{
std::cout << target << std::endl;
}
}
Output:
{"foo":["bar","qux","baz"]}
#include <jsoncons/json.hpp>
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
using jsoncons::json;
namespace jsonpointer = jsoncons::jsonpointer;
int main()
{
auto target = json::parse(R"(
{ "foo": [ "bar", "baz" ] }
)");
std::error_code ec;
jsonpointer::add_if_absent(target, "/foo/-", json("qux"), ec);
if (ec)
{
std::cout << ec.message() << std::endl;
}
else
{
std::cout << target << std::endl;
}
}
Output:
{"foo":["bar","baz","qux"]}
#include <jsoncons/json.hpp>
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
using jsoncons::json;
namespace jsonpointer = jsoncons::jsonpointer;
int main()
{
auto target = json::parse(R"(
{ "foo": "bar", "baz" : "abc"}
)");
std::error_code ec;
jsonpointer::add_if_absent(target, "/baz", json("qux"), ec);
if (ec)
{
std::cout << ec.message() << std::endl;
}
else
{
std::cout << target << std::endl;
}
}
Output:
Key already exists
#include <jsoncons/json.hpp>
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
using jsoncons::json;
namespace jsonpointer = jsoncons::jsonpointer;
int main()
{
auto target = json::parse(R"(
{ "foo": [ "bar", "baz" ] }
)");
std::error_code ec;
jsonpointer::add(target, "/foo/3", json("qux"), ec);
if (ec)
{
std::cout << ec.message() << std::endl;
}
else
{
std::cout << target << std::endl;
}
}
Output:
Index exceeds array size
#include <iostream>
#include <jsoncons/json.hpp>
#include <jsoncons_ext/jsonpointer/jsonpointer.hpp>
using jsoncons::json;
namespace jsonpointer = jsoncons::jsonpointer;
int main()
{
std::vector<std::string> keys = { "foo","bar","baz" };
jsonpointer::json_pointer location;
for (const auto& key : keys)
{
location /= key;
}
json doc;
jsonpointer::add_if_absent(doc, location, "str", true);
std::cout << pretty_print(doc) << "\n\n";
}
Output:
{
"foo": {
"bar": {
"baz": "str"
}
}
}