# nlohmann::basic_json Defined in header `` ``` template< template class ObjectType = std::map, template class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template class AllocatorType = std::allocator, template class JSONSerializer = adl_serializer, class BinaryType = std::vector, class CustomBaseClass = void > class basic_json; ``` ## Template parameters | Template parameter | Description | Derived type | | -------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | `ObjectType` | type for JSON objects | [`object_t`](https://json.nlohmann.me/api/basic_json/object_t/index.md) | | `ArrayType` | type for JSON arrays | [`array_t`](https://json.nlohmann.me/api/basic_json/array_t/index.md) | | `StringType` | type for JSON strings and object keys | [`string_t`](https://json.nlohmann.me/api/basic_json/string_t/index.md) | | `BooleanType` | type for JSON booleans | [`boolean_t`](https://json.nlohmann.me/api/basic_json/boolean_t/index.md) | | `NumberIntegerType` | type for JSON integer numbers | [`number_integer_t`](https://json.nlohmann.me/api/basic_json/number_integer_t/index.md) | | `NumberUnsignedType` | type for JSON unsigned integer numbers | [`number_unsigned_t`](https://json.nlohmann.me/api/basic_json/number_unsigned_t/index.md) | | `NumberFloatType` | type for JSON floating-point numbers | [`number_float_t`](https://json.nlohmann.me/api/basic_json/number_float_t/index.md) | | `AllocatorType` | type of the allocator to use | | | `JSONSerializer` | the serializer to resolve internal calls to `to_json()` and `from_json()` | [`json_serializer`](https://json.nlohmann.me/api/basic_json/json_serializer/index.md) | | `BinaryType` | type for binary arrays | [`binary_t`](https://json.nlohmann.me/api/basic_json/binary_t/index.md) | | `CustomBaseClass` | extension point for user code | [`json_base_class_t`](https://json.nlohmann.me/api/basic_json/json_base_class_t/index.md) | ## Specializations - [**json**](https://json.nlohmann.me/api/json/index.md) - default specialization - [**ordered_json**](https://json.nlohmann.me/api/ordered_json/index.md) - a specialization that maintains the insertion order of object keys ## Iterator invalidation All operations that add values to an **array** ([`push_back`](https://json.nlohmann.me/api/basic_json/push_back/index.md) , [`operator+=`](https://json.nlohmann.me/api/basic_json/operator%2B%3D/index.md), [`emplace_back`](https://json.nlohmann.me/api/basic_json/emplace_back/index.md), [`insert`](https://json.nlohmann.me/api/basic_json/insert/index.md), and [`operator[]`](https://json.nlohmann.me/api/basic_json/operator%5B%5D/index.md) for a non-existing index) can yield a reallocation, in which case all iterators (including the [`end()`](https://json.nlohmann.me/api/basic_json/end/index.md) iterator) and all references to the elements are invalidated. For [`ordered_json`](https://json.nlohmann.me/api/ordered_json/index.md), also all operations that add a value to an **object** ([`push_back`](https://json.nlohmann.me/api/basic_json/push_back/index.md), [`operator+=`](https://json.nlohmann.me/api/basic_json/operator%2B%3D/index.md), [`emplace`](https://json.nlohmann.me/api/basic_json/emplace/index.md), [`insert`](https://json.nlohmann.me/api/basic_json/insert/index.md), [`update`](https://json.nlohmann.me/api/basic_json/update/index.md), and [`operator[]`](https://json.nlohmann.me/api/basic_json/operator%5B%5D/index.md) for a non-existing key) can yield a reallocation, in which case all iterators (including the [`end()`](https://json.nlohmann.me/api/basic_json/end/index.md) iterator) and all references to the elements are invalidated. ## Requirements The class satisfies the following concept requirements: ### Basic - [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible): JSON values can be default-constructed. The result will be a JSON null value. - [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible): A JSON value can be constructed from an rvalue argument. - [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible): A JSON value can be copy-constructed from an lvalue expression. - [MoveAssignable](https://en.cppreference.com/w/cpp/named_req/MoveAssignable): A JSON value can be assigned from an rvalue argument. - [CopyAssignable](https://en.cppreference.com/w/cpp/named_req/CopyAssignable): A JSON value can be copy-assigned from an lvalue expression. - [Destructible](https://en.cppreference.com/w/cpp/named_req/Destructible): JSON values can be destructed. ### Layout - [StandardLayoutType](https://en.cppreference.com/w/cpp/named_req/StandardLayoutType): JSON values have [standard layout](https://en.cppreference.com/w/cpp/language/data_members#Standard_layout): All non-static data members are private and standard layout types, the class has no virtual functions or (virtual) base classes. ### Library-wide - [EqualityComparable](https://en.cppreference.com/w/cpp/named_req/EqualityComparable): JSON values can be compared with `==`, see [`operator==`](https://json.nlohmann.me/api/basic_json/operator_eq/index.md). - [LessThanComparable](https://en.cppreference.com/w/cpp/named_req/LessThanComparable): JSON values can be compared with `<`, see [`operator<`](https://json.nlohmann.me/api/basic_json/operator_le/index.md). - [Swappable](https://en.cppreference.com/w/cpp/named_req/Swappable): Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of other compatible types, using unqualified function `swap`. - [NullablePointer](https://en.cppreference.com/w/cpp/named_req/NullablePointer): JSON values can be compared against `std::nullptr_t` objects which are used to model the `null` value. ### Container - [Container](https://en.cppreference.com/w/cpp/named_req/Container): JSON values can be used like STL containers and provide iterator access. - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer): JSON values can be used like STL containers and provide reverse iterator access. ## Member types - [**adl_serializer**](https://json.nlohmann.me/api/adl_serializer/index.md) - the default serializer - [**value_t**](https://json.nlohmann.me/api/basic_json/value_t/index.md) - the JSON type enumeration - [**json_pointer**](https://json.nlohmann.me/api/json_pointer/index.md) - JSON Pointer implementation - [**json_serializer**](https://json.nlohmann.me/api/basic_json/json_serializer/index.md) - type of the serializer to for conversions from/to JSON - [**error_handler_t**](https://json.nlohmann.me/api/basic_json/error_handler_t/index.md) - type to choose behavior on decoding errors - [**cbor_tag_handler_t**](https://json.nlohmann.me/api/basic_json/cbor_tag_handler_t/index.md) - type to choose how to handle CBOR tags - **initializer_list_t** - type for initializer lists of `basic_json` values - [**input_format_t**](https://json.nlohmann.me/api/basic_json/input_format_t/index.md) - type to choose the format to parse - [**json_sax_t**](https://json.nlohmann.me/api/json_sax/index.md) - type for SAX events ### Exceptions - [**exception**](https://json.nlohmann.me/api/basic_json/exception/index.md) - general exception of the `basic_json` class - [**parse_error**](https://json.nlohmann.me/api/basic_json/parse_error/index.md) - exception indicating a parse error - [**invalid_iterator**](https://json.nlohmann.me/api/basic_json/invalid_iterator/index.md) - exception indicating errors with iterators - [**type_error**](https://json.nlohmann.me/api/basic_json/type_error/index.md) - exception indicating executing a member function with a wrong type - [**out_of_range**](https://json.nlohmann.me/api/basic_json/out_of_range/index.md) - exception indicating access out of the defined range - [**other_error**](https://json.nlohmann.me/api/basic_json/other_error/index.md) - exception indicating other library errors ### Container types | Type | Definition | | ------------------------ | --------------------------------------------------------------------------------------------------------- | | `value_type` | `basic_json` | | `reference` | `value_type&` | | `const_reference` | `const value_type&` | | `difference_type` | `std::ptrdiff_t` | | `size_type` | `std::size_t` | | `allocator_type` | `AllocatorType` | | `pointer` | `std::allocator_traits::pointer` | | `const_pointer` | `std::allocator_traits::const_pointer` | | `iterator` | [LegacyBidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator) | | `const_iterator` | constant [LegacyBidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator) | | `reverse_iterator` | reverse iterator, derived from `iterator` | | `const_reverse_iterator` | reverse iterator, derived from `const_iterator` | | `iteration_proxy` | helper type for [`items`](https://json.nlohmann.me/api/basic_json/items/index.md) function | ### JSON value data types - [**array_t**](https://json.nlohmann.me/api/basic_json/array_t/index.md) - type for arrays - [**binary_t**](https://json.nlohmann.me/api/basic_json/binary_t/index.md) - type for binary arrays - [**boolean_t**](https://json.nlohmann.me/api/basic_json/boolean_t/index.md) - type for booleans - [**default_object_comparator_t**](https://json.nlohmann.me/api/basic_json/default_object_comparator_t/index.md) - default comparator for objects - [**number_float_t**](https://json.nlohmann.me/api/basic_json/number_float_t/index.md) - type for numbers (floating-point) - [**number_integer_t**](https://json.nlohmann.me/api/basic_json/number_integer_t/index.md) - type for numbers (integer) - [**number_unsigned_t**](https://json.nlohmann.me/api/basic_json/number_unsigned_t/index.md) - type for numbers (unsigned) - [**object_comparator_t**](https://json.nlohmann.me/api/basic_json/object_comparator_t/index.md) - comparator for objects - [**object_t**](https://json.nlohmann.me/api/basic_json/object_t/index.md) - type for objects - [**string_t**](https://json.nlohmann.me/api/basic_json/string_t/index.md) - type for strings ### Parser callback - [**parse_event_t**](https://json.nlohmann.me/api/basic_json/parse_event_t/index.md) - parser event types - [**parser_callback_t**](https://json.nlohmann.me/api/basic_json/parser_callback_t/index.md) - per-element parser callback type ## Member functions - [(constructor)](https://json.nlohmann.me/api/basic_json/basic_json/index.md) - [(destructor)](https://json.nlohmann.me/api/basic_json/~basic_json/index.md) - [**operator=**](https://json.nlohmann.me/api/basic_json/operator%3D/index.md) - copy assignment - [**array**](https://json.nlohmann.me/api/basic_json/array/index.md) (*static*) - explicitly create an array - [**binary**](https://json.nlohmann.me/api/basic_json/binary/index.md) (*static*) - explicitly create a binary array - [**object**](https://json.nlohmann.me/api/basic_json/object/index.md) (*static*) - explicitly create an object ### Object inspection Functions to inspect the type of a JSON value. - [**type**](https://json.nlohmann.me/api/basic_json/type/index.md) - return the type of the JSON value - [**operator value_t**](https://json.nlohmann.me/api/basic_json/operator_value_t/index.md) - return the type of the JSON value - [**type_name**](https://json.nlohmann.me/api/basic_json/type_name/index.md) - return the type as string - [**is_primitive**](https://json.nlohmann.me/api/basic_json/is_primitive/index.md) - return whether the type is primitive - [**is_structured**](https://json.nlohmann.me/api/basic_json/is_structured/index.md) - return whether the type is structured - [**is_null**](https://json.nlohmann.me/api/basic_json/is_null/index.md) - return whether the value is null - [**is_boolean**](https://json.nlohmann.me/api/basic_json/is_boolean/index.md) - return whether the value is a boolean - [**is_number**](https://json.nlohmann.me/api/basic_json/is_number/index.md) - return whether the value is a number - [**is_number_integer**](https://json.nlohmann.me/api/basic_json/is_number_integer/index.md) - return whether the value is an integer number - [**is_number_unsigned**](https://json.nlohmann.me/api/basic_json/is_number_unsigned/index.md) - return whether the value is an unsigned integer number - [**is_number_float**](https://json.nlohmann.me/api/basic_json/is_number_float/index.md) - return whether the value is a floating-point number - [**is_object**](https://json.nlohmann.me/api/basic_json/is_object/index.md) - return whether the value is an object - [**is_array**](https://json.nlohmann.me/api/basic_json/is_array/index.md) - return whether the value is an array - [**is_string**](https://json.nlohmann.me/api/basic_json/is_string/index.md) - return whether the value is a string - [**is_binary**](https://json.nlohmann.me/api/basic_json/is_binary/index.md) - return whether the value is a binary array - [**is_discarded**](https://json.nlohmann.me/api/basic_json/is_discarded/index.md) - return whether the value is discarded Optional functions to access the [diagnostic positions](https://json.nlohmann.me/api/macros/json_diagnostic_positions/index.md). - [**start_pos**](https://json.nlohmann.me/api/basic_json/start_pos/index.md) - return the start position of the value - [**end_pos**](https://json.nlohmann.me/api/basic_json/end_pos/index.md) - return the one past the end position of the value ### Value access Direct access to the stored value of a JSON value. - [**get**](https://json.nlohmann.me/api/basic_json/get/index.md) - get a value - [**get_to**](https://json.nlohmann.me/api/basic_json/get_to/index.md) - get a value and write it to a destination - [**get_ptr**](https://json.nlohmann.me/api/basic_json/get_ptr/index.md) - get a pointer value - [**get_ref**](https://json.nlohmann.me/api/basic_json/get_ref/index.md) - get a reference value - [**operator ValueType**](https://json.nlohmann.me/api/basic_json/operator_ValueType/index.md) - get a value - [**get_binary**](https://json.nlohmann.me/api/basic_json/get_binary/index.md) - get a binary value ### Element access Access to the JSON value - [**at**](https://json.nlohmann.me/api/basic_json/at/index.md) - access specified element with bounds checking - [**operator[]**](https://json.nlohmann.me/api/basic_json/operator%5B%5D/index.md) - access specified element - [**value**](https://json.nlohmann.me/api/basic_json/value/index.md) - access specified object element with default value - [**front**](https://json.nlohmann.me/api/basic_json/front/index.md) - access the first element - [**back**](https://json.nlohmann.me/api/basic_json/back/index.md) - access the last element ### Lookup - [**find**](https://json.nlohmann.me/api/basic_json/find/index.md) - find an element in a JSON object - [**count**](https://json.nlohmann.me/api/basic_json/count/index.md) - returns the number of occurrences of a key in a JSON object - [**contains**](https://json.nlohmann.me/api/basic_json/contains/index.md) - check the existence of an element in a JSON object ### Iterators - [**begin**](https://json.nlohmann.me/api/basic_json/begin/index.md) - returns an iterator to the first element - [**cbegin**](https://json.nlohmann.me/api/basic_json/cbegin/index.md) - returns a const iterator to the first element - [**end**](https://json.nlohmann.me/api/basic_json/end/index.md) - returns an iterator to one past the last element - [**cend**](https://json.nlohmann.me/api/basic_json/cend/index.md) - returns a const iterator to one past the last element - [**rbegin**](https://json.nlohmann.me/api/basic_json/rbegin/index.md) - returns an iterator to the reverse-beginning - [**rend**](https://json.nlohmann.me/api/basic_json/rend/index.md) - returns an iterator to the reverse-end - [**crbegin**](https://json.nlohmann.me/api/basic_json/crbegin/index.md) - returns a const iterator to the reverse-beginning - [**crend**](https://json.nlohmann.me/api/basic_json/crend/index.md) - returns a const iterator to the reverse-end - [**items**](https://json.nlohmann.me/api/basic_json/items/index.md) - wrapper to access iterator member functions in range-based for ### Capacity - [**empty**](https://json.nlohmann.me/api/basic_json/empty/index.md) - checks whether the container is empty - [**size**](https://json.nlohmann.me/api/basic_json/size/index.md) - returns the number of elements - [**max_size**](https://json.nlohmann.me/api/basic_json/max_size/index.md) - returns the maximum possible number of elements ### Modifiers - [**clear**](https://json.nlohmann.me/api/basic_json/clear/index.md) - clears the contents - [**push_back**](https://json.nlohmann.me/api/basic_json/push_back/index.md) - add a value to an array/object - [**operator+=**](https://json.nlohmann.me/api/basic_json/operator%2B%3D/index.md) - add a value to an array/object - [**emplace_back**](https://json.nlohmann.me/api/basic_json/emplace_back/index.md) - add a value to an array - [**emplace**](https://json.nlohmann.me/api/basic_json/emplace/index.md) - add a value to an object if a key does not exist - [**erase**](https://json.nlohmann.me/api/basic_json/erase/index.md) - remove elements - [**insert**](https://json.nlohmann.me/api/basic_json/insert/index.md) - inserts elements - [**update**](https://json.nlohmann.me/api/basic_json/update/index.md) - updates a JSON object from another object, overwriting existing keys - [**swap**](https://json.nlohmann.me/api/basic_json/swap/index.md) - exchanges the values ### Lexicographical comparison operators - [**operator==**](https://json.nlohmann.me/api/basic_json/operator_eq/index.md) - comparison: equal - [**operator!=**](https://json.nlohmann.me/api/basic_json/operator_ne/index.md) - comparison: not equal - [**operator\<**](https://json.nlohmann.me/api/basic_json/operator_lt/index.md) - comparison: less than - [**operator>**](https://json.nlohmann.me/api/basic_json/operator_gt/index.md) - comparison: greater than - [**operator\<=**](https://json.nlohmann.me/api/basic_json/operator_le/index.md) - comparison: less than or equal - [**operator>=**](https://json.nlohmann.me/api/basic_json/operator_ge/index.md) - comparison: greater than or equal - [**operator\<=>**](https://json.nlohmann.me/api/basic_json/operator_spaceship/index.md) - comparison: 3-way ### Serialization / Dumping - [**dump**](https://json.nlohmann.me/api/basic_json/dump/index.md) - serialization ### Deserialization / Parsing - [**parse**](https://json.nlohmann.me/api/basic_json/parse/index.md) (*static*) - deserialize from a compatible input - [**accept**](https://json.nlohmann.me/api/basic_json/accept/index.md) (*static*) - check if the input is valid JSON - [**sax_parse**](https://json.nlohmann.me/api/basic_json/sax_parse/index.md) (*static*) - generate SAX events ### JSON Pointer functions - [**flatten**](https://json.nlohmann.me/api/basic_json/flatten/index.md) - return flattened JSON value - [**unflatten**](https://json.nlohmann.me/api/basic_json/unflatten/index.md) - unflatten a previously flattened JSON value ### JSON Patch functions - [**patch**](https://json.nlohmann.me/api/basic_json/patch/index.md) - applies a JSON patch - [**patch_inplace**](https://json.nlohmann.me/api/basic_json/patch_inplace/index.md) - applies a JSON patch in place - [**diff**](https://json.nlohmann.me/api/basic_json/diff/index.md) (*static*) - creates a diff as a JSON patch ### JSON Merge Patch functions - [**merge_patch**](https://json.nlohmann.me/api/basic_json/merge_patch/index.md) - applies a JSON Merge Patch ## Static functions - [**meta**](https://json.nlohmann.me/api/basic_json/meta/index.md) - returns version information on the library - [**get_allocator**](https://json.nlohmann.me/api/basic_json/get_allocator/index.md) - returns the allocator associated with the container ### Binary formats - [**from_bjdata**](https://json.nlohmann.me/api/basic_json/from_bjdata/index.md) (*static*) - create a JSON value from an input in BJData format - [**from_bson**](https://json.nlohmann.me/api/basic_json/from_bson/index.md) (*static*) - create a JSON value from an input in BSON format - [**from_cbor**](https://json.nlohmann.me/api/basic_json/from_cbor/index.md) (*static*) - create a JSON value from an input in CBOR format - [**from_msgpack**](https://json.nlohmann.me/api/basic_json/from_msgpack/index.md) (*static*) - create a JSON value from an input in MessagePack format - [**from_ubjson**](https://json.nlohmann.me/api/basic_json/from_ubjson/index.md) (*static*) - create a JSON value from an input in UBJSON format - [**to_bjdata**](https://json.nlohmann.me/api/basic_json/to_bjdata/index.md) (*static*) - create a BJData serialization of a given JSON value - [**to_bson**](https://json.nlohmann.me/api/basic_json/to_bson/index.md) (*static*) - create a BSON serialization of a given JSON value - [**to_cbor**](https://json.nlohmann.me/api/basic_json/to_cbor/index.md) (*static*) - create a CBOR serialization of a given JSON value - [**to_msgpack**](https://json.nlohmann.me/api/basic_json/to_msgpack/index.md) (*static*) - create a MessagePack serialization of a given JSON value - [**to_ubjson**](https://json.nlohmann.me/api/basic_json/to_ubjson/index.md) (*static*) - create a UBJSON serialization of a given JSON value ## Non-member functions - [**operator\<<(std::ostream&)**](https://json.nlohmann.me/api/operator_ltlt/index.md) - serialize to stream - [**operator>>(std::istream&)**](https://json.nlohmann.me/api/operator_gtgt/index.md) - deserialize from stream - [**to_string**](https://json.nlohmann.me/api/basic_json/to_string/index.md) - user-defined `to_string` function for JSON values - [**format_as**](https://json.nlohmann.me/api/basic_json/format_as/index.md) - user-defined `format_as` function for JSON values (fmt support) ## Literals - [**operator""\_json**](https://json.nlohmann.me/api/operator_literal_json/index.md) - user-defined string literal for JSON values ## Helper classes - [**std::formatter\**](https://json.nlohmann.me/api/basic_json/std_formatter/index.md) - make JSON values formattable with `std::format` - [**std::hash\**](https://json.nlohmann.me/api/basic_json/std_hash/index.md) - return a hash value for a JSON object - [**std::swap\**](https://json.nlohmann.me/api/basic_json/std_swap/index.md) - exchanges the values of two JSON objects ## Examples Example The example shows how the library is used. ``` #include #include #include using json = nlohmann::json; int main() { // create a JSON object json j = { {"pi", 3.141}, {"happy", true}, {"name", "Niels"}, {"nothing", nullptr}, { "answer", { {"everything", 42} } }, {"list", {1, 0, 2}}, { "object", { {"currency", "USD"}, {"value", 42.99} } } }; // add new values j["new"]["key"]["value"] = {"another", "list"}; // count elements auto s = j.size(); j["size"] = s; // pretty print with indent of 4 spaces std::cout << std::setw(4) << j << '\n'; } ``` Output: ``` { "answer": { "everything": 42 }, "happy": true, "list": [ 1, 0, 2 ], "name": "Niels", "new": { "key": { "value": [ "another", "list" ] } }, "nothing": null, "object": { "currency": "USD", "value": 42.99 }, "pi": 3.141, "size": 8 } ``` ## See also - [RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format](https://tools.ietf.org/html/rfc8259) ## Version history - Added in version 1.0.0.