# nlohmann::basic_json::at ``` // (1) reference at(size_type idx); const_reference at(size_type idx) const; // (2) reference at(const typename object_t::key_type& key); const_reference at(const typename object_t::key_type& key) const; // (3) template reference at(KeyType&& key); template const_reference at(KeyType&& key) const; // (4) reference at(const json_pointer& ptr); const_reference at(const json_pointer& ptr) const; ``` 1. Returns a reference to the array element at specified location `idx`, with bounds checking. 1. Returns a reference to the object element with specified key `key`, with bounds checking. 1. See 2. This overload is only available if `KeyType` is comparable with `typename object_t::key_type` and `typename object_comparator_t::is_transparent` denotes a type. 1. Returns a reference to the element at specified JSON pointer `ptr`, with bounds checking. ## Template parameters `KeyType` : A type for an object key other than [`json_pointer`](https://json.nlohmann.me/api/json_pointer/index.md) that is comparable with [`string_t`](https://json.nlohmann.me/api/basic_json/string_t/index.md) using [`object_comparator_t`](https://json.nlohmann.me/api/basic_json/object_comparator_t/index.md). This can also be a string view (C++17). ## Parameters `idx` (in) : index of the element to access `key` (in) : object key of the elements to access `ptr` (in) : JSON pointer to the desired element ## Return value 1. reference to the element at index `idx` 1. reference to the element at key `key` 1. reference to the element at key `key` 1. 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.304`](https://json.nlohmann.me/home/exceptions/#jsonexceptiontype_error304) if the JSON value is not an array; in this case, calling `at` with an index makes no sense. See the example below. - Throws [`out_of_range.401`](https://json.nlohmann.me/home/exceptions/#jsonexceptionout_of_range401) if the index `idx` is out of range of the array; that is, `idx >= size()`. See the example below. 1. The function can throw the following exceptions: - Throws [`type_error.304`](https://json.nlohmann.me/home/exceptions/#jsonexceptiontype_error304) if the JSON value is not an object; in this case, calling `at` with a key makes no sense. See the example below. - Throws [`out_of_range.403`](https://json.nlohmann.me/home/exceptions/#jsonexceptionout_of_range403) if the key `key` is not stored in the object; that is, `find(key) == end()`. See the example below. 1. See 2. 1. The function can throw the following exceptions: - Throws [`parse_error.106`](https://json.nlohmann.me/home/exceptions/#jsonexceptionparse_error106) if an array index in the passed JSON pointer `ptr` begins with '0'. See the example below. - Throws [`parse_error.109`](https://json.nlohmann.me/home/exceptions/#jsonexceptionparse_error109) if an array index in the passed JSON pointer `ptr` is not a number. See the example below. - Throws [`out_of_range.401`](https://json.nlohmann.me/home/exceptions/#jsonexceptionout_of_range401) if an array index in the passed JSON pointer `ptr` is out of range. See the example below. - Throws [`out_of_range.402`](https://json.nlohmann.me/home/exceptions/#jsonexceptionout_of_range402) if the array index '-' is used in the passed JSON pointer `ptr`. As `at` provides checked access (and no elements are implicitly inserted), the index '-' is always invalid. See the example below. - Throws [`out_of_range.403`](https://json.nlohmann.me/home/exceptions/#jsonexceptionout_of_range403) if the JSON pointer describes a key of an object which cannot be found. See the example below. - Throws [`out_of_range.404`](https://json.nlohmann.me/home/exceptions/#jsonexceptionout_of_range404) if the JSON pointer `ptr` can not be resolved. See the example below. - Throws [`out_of_range.410`](https://json.nlohmann.me/home/exceptions/#jsonexceptionout_of_range410) if an array index in the passed JSON pointer `ptr` exceeds the range of `size_type` (e.g., on 32-bit platforms). ## Complexity 1. Constant. 1. Logarithmic in the size of the container. 1. Logarithmic in the size of the container. 1. Logarithmic in the size of the container. ## Examples Example: (1) access specified array element with bounds checking The example below shows how array elements can be read and written using `at()`. It also demonstrates the different exceptions that can be thrown. ``` #include #include using json = nlohmann::json; int main() { // create JSON array json array = {"first", "2nd", "third", "fourth"}; // output element at index 2 (third element) std::cout << array.at(2) << '\n'; // change element at index 1 (second element) to "second" array.at(1) = "second"; // output changed array std::cout << array << '\n'; // exception type_error.304 try { // use at() on a non-array type json str = "I am a string"; str.at(0) = "Another string"; } catch (const json::type_error& e) { std::cout << e.what() << '\n'; } // exception out_of_range.401 try { // try to write beyond the array limit array.at(5) = "sixth"; } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } } ``` Output: ``` "third" ["first","second","third","fourth"] [json.exception.type_error.304] cannot use at() with string [json.exception.out_of_range.401] array index 5 is out of range ``` Example: (1) access specified array element with bounds checking The example below shows how array elements can be read using `at()`. It also demonstrates the different exceptions that can be thrown. ``` #include #include using json = nlohmann::json; int main() { // create JSON array const json array = {"first", "2nd", "third", "fourth"}; // output element at index 2 (third element) std::cout << array.at(2) << '\n'; // exception type_error.304 try { // use at() on a non-array type const json str = "I am a string"; std::cout << str.at(0) << '\n'; } catch (const json::type_error& e) { std::cout << e.what() << '\n'; } // exception out_of_range.401 try { // try to read beyond the array limit std::cout << array.at(5) << '\n'; } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } } ``` Output: ``` "third" [json.exception.type_error.304] cannot use at() with string [json.exception.out_of_range.401] array index 5 is out of range ``` Example: (2) access specified object element with bounds checking The example below shows how object elements can be read and written using `at()`. It also demonstrates the different exceptions that can be thrown. ``` #include #include using json = nlohmann::json; int main() { // create JSON object json object = { {"the good", "il buono"}, {"the bad", "il cattivo"}, {"the ugly", "il brutto"} }; // output element with key "the ugly" std::cout << object.at("the ugly") << '\n'; // change element with key "the bad" object.at("the bad") = "il cattivo"; // output changed array std::cout << object << '\n'; // exception type_error.304 try { // use at() on a non-object type json str = "I am a string"; str.at("the good") = "Another string"; } catch (const json::type_error& e) { std::cout << e.what() << '\n'; } // exception out_of_range.401 try { // try to write at a nonexisting key object.at("the fast") = "il rapido"; } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } } ``` Output: ``` "il brutto" {"the bad":"il cattivo","the good":"il buono","the ugly":"il brutto"} [json.exception.type_error.304] cannot use at() with string [json.exception.out_of_range.403] key 'the fast' not found ``` Example: (2) access specified object element with bounds checking The example below shows how object elements can be read using `at()`. It also demonstrates the different exceptions that can be thrown. ``` #include #include using json = nlohmann::json; int main() { // create JSON object const json object = { {"the good", "il buono"}, {"the bad", "il cattivo"}, {"the ugly", "il brutto"} }; // output element with key "the ugly" std::cout << object.at("the ugly") << '\n'; // exception type_error.304 try { // use at() on a non-object type const json str = "I am a string"; std::cout << str.at("the good") << '\n'; } catch (const json::type_error& e) { std::cout << e.what() << '\n'; } // exception out_of_range.401 try { // try to read from a nonexisting key std::cout << object.at("the fast") << '\n'; } catch (const json::out_of_range) { std::cout << "out of range" << '\n'; } } ``` Output: ``` "il brutto" [json.exception.type_error.304] cannot use at() with string out of range ``` Example: (3) access specified object element using string_view with bounds checking The example below shows how object elements can be read and written using `at()`. It also demonstrates the different exceptions that can be thrown. ``` #include #include #include using namespace std::string_view_literals; using json = nlohmann::json; int main() { // create JSON object json object = { {"the good", "il buono"}, {"the bad", "il cattivo"}, {"the ugly", "il brutto"} }; // output element with key "the ugly" using string_view std::cout << object.at("the ugly"sv) << '\n'; // change element with key "the bad" using string_view object.at("the bad"sv) = "il cattivo"; // output changed array std::cout << object << '\n'; // exception type_error.304 try { // use at() with string_view on a non-object type json str = "I am a string"; str.at("the good"sv) = "Another string"; } catch (const json::type_error& e) { std::cout << e.what() << '\n'; } // exception out_of_range.401 try { // try to write at a nonexisting key using string_view object.at("the fast"sv) = "il rapido"; } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } } ``` Output: ``` "il brutto" {"the bad":"il cattivo","the good":"il buono","the ugly":"il brutto"} [json.exception.type_error.304] cannot use at() with string [json.exception.out_of_range.403] key 'the fast' not found ``` Example: (3) access specified object element using string_view with bounds checking The example below shows how object elements can be read using `at()`. It also demonstrates the different exceptions that can be thrown. ``` #include #include #include using namespace std::string_view_literals; using json = nlohmann::json; int main() { // create JSON object const json object = { {"the good", "il buono"}, {"the bad", "il cattivo"}, {"the ugly", "il brutto"} }; // output element with key "the ugly" using string_view std::cout << object.at("the ugly"sv) << '\n'; // exception type_error.304 try { // use at() with string_view on a non-object type const json str = "I am a string"; std::cout << str.at("the good"sv) << '\n'; } catch (const json::type_error& e) { std::cout << e.what() << '\n'; } // exception out_of_range.401 try { // try to read from a nonexisting key using string_view std::cout << object.at("the fast"sv) << '\n'; } catch (const json::out_of_range& e) { std::cout << "out of range" << '\n'; } } ``` Output: ``` "il brutto" [json.exception.type_error.304] cannot use at() with string out of range ``` Example: (4) access specified element via JSON Pointer The example below shows how object elements can be read and written using `at()`. It also demonstrates the different exceptions that can be thrown. ``` #include #include using json = nlohmann::json; using namespace nlohmann::literals; int main() { // create a JSON value json j = { {"number", 1}, {"string", "foo"}, {"array", {1, 2}} }; // read-only access // output element with JSON pointer "/number" std::cout << j.at("/number"_json_pointer) << '\n'; // output element with JSON pointer "/string" std::cout << j.at("/string"_json_pointer) << '\n'; // output element with JSON pointer "/array" std::cout << j.at("/array"_json_pointer) << '\n'; // output element with JSON pointer "/array/1" std::cout << j.at("/array/1"_json_pointer) << '\n'; // writing access // change the string j.at("/string"_json_pointer) = "bar"; // output the changed string std::cout << j["string"] << '\n'; // change an array element j.at("/array/1"_json_pointer) = 21; // output the changed array std::cout << j["array"] << '\n'; // out_of_range.106 try { // try to use an array index with leading '0' json::reference ref = j.at("/array/01"_json_pointer); } catch (const json::parse_error& e) { std::cout << e.what() << '\n'; } // out_of_range.109 try { // try to use an array index that is not a number json::reference ref = j.at("/array/one"_json_pointer); } catch (const json::parse_error& e) { std::cout << e.what() << '\n'; } // out_of_range.401 try { // try to use an invalid array index json::reference ref = j.at("/array/4"_json_pointer); } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } // out_of_range.402 try { // try to use the array index '-' json::reference ref = j.at("/array/-"_json_pointer); } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } // out_of_range.403 try { // try to use a JSON pointer to a nonexistent object key json::const_reference ref = j.at("/foo"_json_pointer); } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } // out_of_range.404 try { // try to use a JSON pointer that cannot be resolved json::reference ref = j.at("/number/foo"_json_pointer); } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } } ``` Output: ``` 1 "foo" [1,2] 2 "bar" [1,21] [json.exception.parse_error.106] parse error: array index '01' must not begin with '0' [json.exception.parse_error.109] parse error: array index 'one' is not a number [json.exception.out_of_range.401] array index 4 is out of range [json.exception.out_of_range.402] array index '-' (2) is out of range [json.exception.out_of_range.403] key 'foo' not found [json.exception.out_of_range.404] unresolved reference token 'foo' ``` Example: (4) access specified element via JSON Pointer The example below shows how object elements can be read using `at()`. It also demonstrates the different exceptions that can be thrown. ``` #include #include using json = nlohmann::json; using namespace nlohmann::literals; int main() { // create a JSON value const json j = { {"number", 1}, {"string", "foo"}, {"array", {1, 2}} }; // read-only access // output element with JSON pointer "/number" std::cout << j.at("/number"_json_pointer) << '\n'; // output element with JSON pointer "/string" std::cout << j.at("/string"_json_pointer) << '\n'; // output element with JSON pointer "/array" std::cout << j.at("/array"_json_pointer) << '\n'; // output element with JSON pointer "/array/1" std::cout << j.at("/array/1"_json_pointer) << '\n'; // out_of_range.109 try { // try to use an array index that is not a number json::const_reference ref = j.at("/array/one"_json_pointer); } catch (const json::parse_error& e) { std::cout << e.what() << '\n'; } // out_of_range.401 try { // try to use an invalid array index json::const_reference ref = j.at("/array/4"_json_pointer); } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } // out_of_range.402 try { // try to use the array index '-' json::const_reference ref = j.at("/array/-"_json_pointer); } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } // out_of_range.403 try { // try to use a JSON pointer to a nonexistent object key json::const_reference ref = j.at("/foo"_json_pointer); } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } // out_of_range.404 try { // try to use a JSON pointer that cannot be resolved json::const_reference ref = j.at("/number/foo"_json_pointer); } catch (const json::out_of_range& e) { std::cout << e.what() << '\n'; } } ``` Output: ``` 1 "foo" [1,2] 2 [json.exception.parse_error.109] parse error: array index 'one' is not a number [json.exception.out_of_range.401] array index 4 is out of range [json.exception.out_of_range.402] array index '-' (2) is out of range [json.exception.out_of_range.403] key 'foo' not found [json.exception.out_of_range.404] unresolved reference token 'foo' ``` ## See also - documentation on [checked access](https://json.nlohmann.me/features/element_access/checked_access/index.md) - [`operator[]`](https://json.nlohmann.me/api/basic_json/operator%5B%5D/index.md) for unchecked access by reference - [`value`](https://json.nlohmann.me/api/basic_json/value/index.md) for access with default value ## Version history 1. Added in version 1.0.0. 1. Added in version 1.0.0. 1. Added in version 3.11.0. 1. Added in version 2.0.0.