Files
kaizen/docs/mkdocs/docs/api/basic_json/operator[].md
Simone a28dbbf733 Squashed 'external/json/' changes from 9cca280a4..60c48755e
60c48755e Add missing macros in README and link to docs for more info (#4582)
a6255cc41 add a ci step for Json_Diagnostic_Positions (#4579)
f038ac4c9 Enable modernize-use-integer-sign-comparison check (#4581)
4f64d8d0b Modernize integer comparison (#4577)
2134cb947 Fix NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT with an empty JSON instance (#4508)
6057b31df Overwork astyle call (#4573)
0fa326a8e Use Clang image to run iwyu (#4574)
8314ac2f7 Use ubuntu-latest image to run Valgrind (#4575)
69c8758d5 fix the abi tests for diagnostics positions feature (#4572)
5ff90d9e0 fix diagnostic positions related compilation errors (#4570)
6be4e8560 Bump cppcheck from 1.4.6 to 1.4.7 in /cmake/requirements (#4567)
663058e7d Fix typo in nlohmann_define_derived_type.md (#4565)
af4ad7915 Add ONLY_SERIALIZE for NLOHMANN_DEFINE_DERIVED_TYPE_* macros (#4562)
58f5f2596 json start/end position implementation (#4517)
733c59588 Bump actions/upload-artifact from 4.4.3 to 4.5.0 (#4557)
6cb099e30 Suppress modernize-use-integer-sign-comparison (#4558)
094bd2651 Set parents after insert call (#4537)
30cd44df9 Clean up CI (#4553)
5362012fd [StepSecurity] ci: Harden GitHub Actions (#4551)
861ec9c3c Fix token permissions warnings (#4550)
f4910b20c Bump mkdocs-material from 9.5.48 to 9.5.49 in /docs/mkdocs (#4548)
f2a4ac067 Add step to build the documentation (#4549)
8e1b80001 Move reuse dependency to requirements.txt file (#4547)
677e19e39 Clean up  (#4546)
9e23b5d61 ⬆️ Bump watchdog from 2.1.7 to 6.0.0 in /tools/serve_header (#4542)
eb142e33c ⬆️ Bump ossf/scorecard-action from 2.3.3 to 2.4.0 (#4545)
1c8e26dcb ⬆️ Bump lukka/get-cmake from 3.31.0 to 3.31.2 (#4544)
b6b8378c8 ⬆️ Bump github/codeql-action from 2.27.9 to 3.27.9 (#4543)
58949c0ad ⬆️ Bump actions/github-script from 6.4.0 to 7.0.1 (#4540)
7cfbe321b ⬆️ Bump pyyaml from 6.0 to 6.0.2 in /tools/serve_header (#4541)
4003f8da0 [StepSecurity] Apply security best practices (#4539)
6a2ae22a5 📝 add OpenSSF Scorecard badge
620034ece ♻️ allow patch and diff to be used with arbitrary string types (#4536)
e6cafa573 📝 fix CPM.cmake example
e0a17f847 📝 add more package managers (#4533)
20ae363a7 Replace EOF with char_traits (#4532)
589641b17 Add support of multi-dim C-style array member of struct. (#4262)
f385fe28f 💸 update sponsors
981a4c39f 📝 trigger documentation build
dd81f878f 🚀 fix permissions
549c79ba7 Overwork documentation (#4516)
9f60e8555 Fix return value of get_ptr for unsigned integers (#4525)
a006a7a48 Add more GCC warning flags (#4524)
1b9a9d1f2 Update licenses (#4521)
935c6eeb5 Optimize binary `get_number` implementation by reading multiple bytes at once (#4391)
e41905fcb 💸 thanks @phrrngtn
d333f0895 CMake: generate a pkg-config file that follow pkg-config conventions (#4456)
3d6c664de Allow comparing default initialized iterators (#4512)
ee32bfc1c Make SAX output locale-independent (#4505)
a97041a98 Skip enum tests when JSON_DisableEnumSerialization=ON (#4504)
f9f8c0779 fix: integer parsed as float when EINTR set in errno (#4506)
378e09179 Fix weak-vtables warning (#4500)
1f218e107 Possible fix for #4485 (#4487)
64f68dc56 Suppress warnings in NLOHMANN_JSON_SERIALIZE_ENUM (#4497)
1c5923e5d Add comment for #4494 (#4496)
e3ac5a64b Add test for libstdc++ (#4495)
e509007df Remove alwayslink=True Bazel flag (#4396)
060414037 feat: Rebase `feature/optional` to `develop` (#4036)
fd20975a9 Add CPack support (#4459)
fde9a86c5 Make iterator_proxy_value a forward_iterator (#4371) (#4372)
1825117e6 Another desperate try to fix the CI (#4489)
4a602df34 Add lgtm explanation (#4362)
18ff442e6 Allow overriding the CMake target name (#4483)
aff5a31d3 Add NLOHMANN_DEFINE_DERIVED_TYPE_* macros (#4033)
ac8b22180 Update CONTRIBUTING.md (#4486)
632583977 Update is_structured.md (#4472)
b36f4c477 Update natvis to reflect 3.11.3 and the current structure of basic_json (#4451)
960b763ec Docs: fix typos of 'whether' in `operator_{gt,le,lt}.md` (#4412)
8c391e04f Docs: Fix wrong code usage in the Value access section of `json_pointer.md` (#4255)
01da82eae Fix gdb pretty printer (#4343)
97f0bdaf9 chore: fix some typos in comments (#4345)
c883fb0f1 Fix for incorrect function name in documentation example (#4342)
377c767aa Updated exception handling to catch const reference in out_of_range (#4331)
16b3d841d Fixed an error in the `Custom data source` example. (#4335)
199dea11b #4307 Updated docx to 3.10.5 from 3.10.4 (#4310)
0457de21c Align astyle flags in Makefile with CI (#4277)
c35d260c2 Suppress Clang-Tidy warnings (#4276)
6a064e026 Remove broken link from CONTRIBUTING.md (#4274)
7efe87549 Update json_has_static_rtti.md (#4269)
a259ecc51 Fix `to_json` for enums when the enum has an unsigned underlying type. (#4237)
3780b41dd 💰 update sponsors

git-subtree-dir: external/json
git-subtree-split: 60c48755e3f717eace7830d7bbc0d8f1a5e0cc8a
2025-01-07 15:12:10 +00:00

8.4 KiB

nlohmann::basic_json::operator[]

// (1)
reference operator[](size_type idx);
const_reference operator[](size_type idx) const;

// (2)
reference operator[](typename object_t::key_type key);
const_reference operator[](const typename object_t::key_type& key) const;

// (3)
template<typename KeyType>
reference operator[](KeyType&& key);
template<typename KeyType>
const_reference operator[](KeyType&& key) const;

// (4)
reference operator[](const json_pointer& ptr);
const_reference operator[](const json_pointer& ptr) const;
  1. Returns a reference to the array element at specified location idx.
  2. Returns a reference to the object element with specified key key. The non-const qualified overload takes the key by value.
  3. See 2. This overload is only available if KeyType is comparable with #!cpp typename object_t::key_type and #!cpp typename object_comparator_t::is_transparent denotes a type.
  4. Returns a reference to the element with specified JSON pointer ptr.

Template parameters

KeyType
A type for an object key other than json_pointer that is comparable with string_t using object_comparator_t. This can also be a string view (C++17).

Iterator invalidation

For the non-const versions 1. and 4., when passing an array index that does not exist, it is created and filled with a #!json null value before a reference to it is returned. For this, a reallocation can happen, in which case all iterators (including the end() iterator) and all references to the elements are invalidated.

For ordered_json, also passing an object key to the non-const versions 2., 3., and 4., a reallocation can happen which again invalidates all iterators and all references.

Parameters

idx (in)
index of the element to access
key (in)
object key of the element to access
ptr (in)
JSON pointer to the desired element

Return value

  1. (const) reference to the element at index idx
  2. (const) reference to the element at key key
  3. (const) reference to the element at key key
  4. (const) reference to the element pointed to by ptr

Exception safety

Strong exception safety: if an exception occurs, the original value stays intact.

Exceptions

  1. The function can throw the following exceptions:
    • Throws type_error.305 if the JSON value is not an array or null; in that case, using the [] operator with an index makes no sense.
  2. The function can throw the following exceptions:
    • Throws type_error.305 if the JSON value is not an object or null; in that case, using the [] operator with a key makes no sense.
  3. See 2.
  4. The function can throw the following exceptions:
    • Throws parse_error.106 if an array index in the passed JSON pointer ptr begins with '0'.
    • Throws parse_error.109 if an array index in the passed JSON pointer ptr is not a number.
    • Throws out_of_range.402 if the array index '-' is used in the passed JSON pointer ptr for the const version.
    • Throws out_of_range.404 if the JSON pointer ptr can not be resolved.

Complexity

  1. Constant if idx is in the range of the array. Otherwise, linear in idx - size().
  2. Logarithmic in the size of the container.
  3. Logarithmic in the size of the container.
  4. Logarithmic in the size of the container.

Notes

!!! danger "Undefined behavior and runtime assertions"

1. If the element with key `idx` does not exist, the behavior is undefined.
2. If the element with key `key` does not exist, the behavior is undefined and is **guarded by a
   [runtime assertion](../../features/assertions.md)**!
  1. The non-const version may add values: If idx is beyond the range of the array (i.e., idx >= size()), then the array is silently filled up with #!json null values to make idx a valid reference to the last stored element. In case the value was #!json null before, it is converted to an array.

  2. If key is not found in the object, then it is silently added to the object and filled with a #!json null value to make key a valid reference. In case the value was #!json null before, it is converted to an object.

  3. See 2.

  4. null values are created in arrays and objects if necessary.

    In particular:

    • If the JSON pointer points to an object key that does not exist, it is created and filled with a #!json null value before a reference to it is returned.
    • If the JSON pointer points to an array index that does not exist, it is created and filled with a #!json null value before a reference to it is returned. All indices between the current maximum and the given index are also filled with #!json null.
    • The special value - is treated as a synonym for the index past the end.

Examples

??? example "Example: (1) access specified array element"

The example below shows how array elements can be read and written using `[]` operator. Note the addition of
`#!json null` values.
    
```cpp
--8<-- "examples/operator_array__size_type.cpp"
```

Output:

```json
--8<-- "examples/operator_array__size_type.output"
```

??? example "Example: (1) access specified array element (const)"

The example below shows how array elements can be read using the `[]` operator.

```cpp
--8<-- "examples/operator_array__size_type_const.cpp"
```

Output:

```json
--8<-- "examples/operator_array__size_type_const.output"
```

??? example "Example: (2) access specified object element"

The example below shows how object elements can be read and written using the `[]` operator.

```cpp
--8<-- "examples/operator_array__object_t_key_type.cpp"
```

Output:

```json
--8<-- "examples/operator_array__object_t_key_type.output"
```

??? example "Example: (2) access specified object element (const)"

The example below shows how object elements can be read using the `[]` operator.

```cpp
--8<-- "examples/operator_array__object_t_key_type_const.cpp"
```

Output:

```json
--8<-- "examples/operator_array__object_t_key_type_const.output"
```

??? example "Example: (3) access specified object element using string_view"

The example below shows how object elements can be read using the `[]` operator.

```cpp
--8<-- "examples/operator_array__keytype.c++17.cpp"
```

Output:

```json
--8<-- "examples/operator_array__keytype.c++17.output"
```

??? example "Example: (3) access specified object element using string_view (const)"

The example below shows how object elements can be read using the `[]` operator.

```cpp
--8<-- "examples/operator_array__keytype_const.c++17.cpp"
```

Output:

```json
--8<-- "examples/operator_array__keytype_const.c++17.output"
```

??? example "Example: (4) access specified element via JSON Pointer"

The example below shows how values can be read and written using JSON Pointers.

```cpp
--8<-- "examples/operator_array__json_pointer.cpp"
```

Output:

```json
--8<-- "examples/operator_array__json_pointer.output"
```

??? example "Example: (4) access specified element via JSON Pointer (const)"

The example below shows how values can be read using JSON Pointers.

```cpp
--8<-- "examples/operator_array__json_pointer_const.cpp"
```

Output:

```json
--8<-- "examples/operator_array__json_pointer_const.output"
```

See also

Version history

  1. Added in version 1.0.0.
  2. Added in version 1.0.0. Added overloads for T* key in version 1.1.0. Removed overloads for T* key (replaced by 3) in version 3.11.0.
  3. Added in version 3.11.0.
  4. Added in version 2.0.0.