* Review and extend the documentation, and check it in CI A review of all documentation pages found factual errors, dead links, missing cross-references, and gaps in examples. This fixes them and adds checks so the same problems are caught automatically. Fixes: - wrong signatures and version histories (operator!= C++20 member, binary() subtype type, get<PointerType>(), JSON_NO_THREAD_LOCAL, ...) - stale descriptions (number parsing since #5283, UBJSON table, SAX example that no longer compiled, tsl::ordered_map advice) - dead internal and external links; repology.org badges (the domain is suspended) replaced by badges that query the registries directly - deprecation notes link the migration guide; the guide itself fixed Additions: - "See also" sections, cross-references, 25 runnable examples, 12 Mermaid diagrams, new API pages for json_pointer::operator<=> and byte_container_with_subtype::operator==/!= - landing page, guides for untrusted input and performance - "unreleased" badge after versions newer than the latest release Checks: - strict documentation build (broken links/anchors fail it); CI and the publish workflow fetch the full history the build needs - weekly external link check, Mermaid syntax check in CI - check_structure.py: example titles, heading levels, alt texts, header links, docset index coverage; its unused-example check works again - all examples produce the same output on every platform Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Keep the customer links that could not be fixed A dead link on the customers page is still the evidence of where the use of the library was documented. Keep the original URLs of the entries without a working replacement (Marne, Cisco Webex Desk Camera, Philips Hue, CyberArk) and exclude exactly these URLs from the link check. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Correct the duplicate-key recipe's claim about SAX positions The SAX interface's key() receives no position either; only parse_error() does. Also note that the recipe does not report the path to the repeated key (see discussion #5085). Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Say the library is available as a single header and mention json_fwd.hpp Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Correct documentation errors found while hunting for bugs - patch/patch_inplace: list the JSON pointer errors parse_error.106-109 and out_of_range.402/404, and quote the actual parse_error.105 message. - unflatten: list parse_error.106/107/108 and out_of_range.404. - to_bson: list out_of_range.415 (binary subtype above 255) and note that 412 and 415 are new in 3.13.0. - to_string: state that string_t must be convertible to std::string, also in the StringType requirements table. - JSON Lines: a `while (input >> j)` loop also throws after the last value for concatenated JSON values; show a loop that works for both. - BON8: a string gets 0xFF only if nothing follows it in the message; a string at the end of an array or object is ended by 0xFE. - custom_string_type.hpp: add operator+=(char), which the "Always required" list asks for (json_pointer::to_string, flatten, unflatten, and diff did not compile), and an ADL int_to_string for diff and items. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Cache the release headers with functools.lru_cache Codacy (Pylint) flagged the mutable default argument that header() used as its cache. functools.lru_cache keeps the same memoization without it. The script's output is unchanged. Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
4.2 KiB
nlohmann::basic_json::push_back
// (1)
void push_back(basic_json&& val);
void push_back(const basic_json& val);
// (2)
void push_back(const typename object_t::value_type& val);
// (3)
void push_back(initializer_list_t init);
-
Appends the given element
valto the end of the JSON array. If the function is called on a JSON null value, an empty array is created before appendingval. -
Inserts the given element
valto the JSON object. If the function is called on a JSON null value, an empty object is created before insertingval. -
This function allows using
push_backwith an initializer list. In case- the current value is an object,
- the initializer list
initcontains only two elements, and - the first element of
initis a string,
initis converted into an object element and added usingpush_back(const typename object_t::value_type&). Otherwise,initis converted to a JSON value and added usingpush_back(basic_json&&).
Iterator invalidation
For all cases where an element is added to an array, a reallocation can happen, in which case all iterators (including
the end() iterator) and all references to the elements are invalidated. Otherwise, only the
end() iterator is invalidated.
For ordered_json, also adding an element to an object can yield a reallocation which again
invalidates all iterators and all references.
Parameters
val(in)- the value to add to the JSON array/object
init(in)- an initializer list
Exception safety
Strong guarantee: if an exception is thrown, there are no changes to any JSON value. As an exception, a #!json null
value is converted to an empty array or object before the element is added and keeps that type if adding the element
throws.
Exceptions
- Throws
type_error.308when called on a type other than JSON array or null; example:"cannot use push_back() with number" - Throws
type_error.308when called on a type other than JSON object or null; example:"cannot use push_back() with number" - Throws
type_error.308when called on a type other than JSON array or null; example:"cannot use push_back() with number"
Complexity
- Amortized constant.
- Logarithmic in the size of the container, O(log(
size())). - Linear in the size of the initializer list
init.
Notes
(3) This function is required to resolve an ambiguous overload error, because pairs like {"key", "value"} can be both
interpreted as object_t::value_type or std::initializer_list<basic_json>, see
#235 for more information.
Examples
??? example "Example: (1) add element to array"
The example shows how `push_back()` and `+=` can be used to add elements to a JSON array. Note how the `null` value
was silently converted to a JSON array.
```cpp
--8<-- "examples/push_back.cpp"
```
Output:
```json
--8<-- "examples/push_back.output"
```
??? example "Example: (2) add element to object"
The example shows how `push_back()` and `+=` can be used to add elements to a JSON object. Note how the `null` value
was silently converted to a JSON object.
```cpp
--8<-- "examples/push_back__object_t__value.cpp"
```
Output:
```json
--8<-- "examples/push_back__object_t__value.output"
```
??? example "Example: (3) add to object from initializer list"
The example shows how initializer lists are treated as objects when possible.
```cpp
--8<-- "examples/push_back__initializer_list.cpp"
```
Output:
```json
--8<-- "examples/push_back__initializer_list.output"
```
See also
- emplace_back add a value to an array
- operator+= add a value to an array/object
- Modifying values - the article on modifying values
Version history
- Since version 1.0.0.
- Since version 1.0.0.
- Since version 2.0.0.