Add API reference pages for basic_json_document::insert and basic_json_document::erase, matching the style of set.md and push_back.md: signatures, parameters, return values, exception safety, exceptions with their exact ids and messages, complexity, notes on duplicate keys and view/iterator validity, and an example. Add example programs basic_json_document__insert.cpp and basic_json_document__erase.cpp with their expected output, each comparing an edit on an editable document with the same edit on a plain json value to show what is preserved: member order, the spelling of untouched numbers, and, for insert, that a view taken before the insert keeps referring to the same element after its index shifts. Register both new pages in mkdocs.yml, docSet.sql, and the member list of basic_json_document/index.md, add cross-references to them from set.md and push_back.md, and mention insert/erase in the "Editing a document" section of features/json_view.md. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
5.8 KiB
nlohmann::basic_json_document::erase
// (1)
std::size_t erase(view_type object, string_view_t key);
// (2)
template<typename I>
void erase(view_type array, I idx);
// (3)
std::size_t erase(const json_pointer& ptr);
Only an editable document (#!cpp Editable == true, e.g. json_editable_document)
has erase; calling it on a read-only basic_json_document fails to compile (#!cpp static_assert).
- Removes every member of
objectwhose key iskey(see Notes on duplicate keys) and returns how many were removed;#!cpp 0ifobjecthas no member with this key. - Removes the element at index
idxofarray, which must already exist (#!cpp idx < array.size()). - Removes the value the JSON pointer
ptrrefers to, relative toroot(), and returns how many values were removed: the parent of the target must already exist, and the target itself is removed as in 1. (an object member;#!cpp 0or more) or 2. (an array element; always#!cpp 1).ptrmust not be empty --root()itself cannot be erased.
Template parameters
I- an integral type other than
#!cpp bool, deduced (overloads taking a#!cpp boolor a non-integral type foridxdo not participate in overload resolution).
Parameters
object(in)- the object to remove a member of
array(in)- the array to remove an element of
key(in)- the key of the member(s) to remove
idx(in)- the index of the element to remove; a negative value throws (see Exceptions)
ptr(in)- a JSON pointer to the value to remove, relative to
root()
Return value
- the number of removed members (
#!cpp 0ifobjecthad none with thiskey) - (nothing)
- the number of removed values (
#!cpp 0or more for an object member, always#!cpp 1for an array element)
Exceptions
- Throws
type_error.307ifobjectis not an object -- the same messageBasicJsonType::erasethrows for the same type. - Throws
type_error.307ifarrayis not an array. Throwsout_of_range.401ifidxis negative, or if#!cpp idx >= array.size(). - Throws
out_of_range.405("JSON pointer has no parent") ifptris empty. Throws whatatthrows (overload 3) for resolvingptr's parent. For the last reference token itself: if the parent is an array, throws what 2. throws for an index that is out of range, or, for a token that is not a valid array index,parse_error.106(a leading#!cpp '0'),parse_error.109(not a number),out_of_range.410(too large forsize_type), orout_of_range.404(an empty token); otherwise (an object, or a primitive value the pointer's parent resolves to) throws what 1. throws.
Every overload also throws invalid_iterator.202 ("view
does not belong to this document") if object/array is a discarded view or a
view of a different document (overloads 1-2 only; overload 3 always starts from this document's own
root()).
Complexity
- Linear in the number of members of
object. - Linear in the number of elements of
arrayat or afteridx(they move one slot over). - Linear in the number of reference tokens of
ptrand, for each token, in the number of members of the object at that level or the index into the array (asat), plus the complexity of 1. or 2. for the last token.
Notes
!!! info "Duplicate keys"
Overload 1. removes *every* member with `key`, not just the first -- unlike [`set`](set.md), which assigns the
first occurrence and drops the rest. This is why it returns a count rather than a single view: there may be
more than one member removed, or none.
Like set and push_back, erase never moves an element's value: a view still
referring to a removed member or element keeps showing what it last held (see Edits) -- it just no
longer appears when array/object is read, dumped, or iterated. Removing an element of array (2.) does shift the
links to the elements after it, the same way insert, set, or push_back on the same array would; any iterator
already taken over array/object is invalidated by an erase, since it was walking the old layout.
Examples
??? example
The example below drops a deprecated field and a decommissioned entry from a configuration document -- using all
three overloads -- and shows what stays intact that would not with a plain `json`/`ordered_json` value: the order
of the fields around the ones removed, and the exact spelling of a number that was never touched.
```cpp
--8<-- "examples/basic_json_document__erase.cpp"
```
Output:
```json
--8<-- "examples/basic_json_document__erase.output"
```
See also
- insert - insert an element into an array
- set - replace a value, or set an object member, an array element, or the value a JSON pointer refers to
- push_back - append to an array
- root - the view of the root value, the starting point of overload 3
BasicJsonType::erase- the corresponding function ofbasic_json- Edits - what an edit guarantees, for every overload
Version history
- Added in version 3.13.0.