enum class value_t : std::uint8_t { null, object, array, string, boolean, number_integer, number_unsigned, number_float, binary, discarded };
This enumeration collects the different JSON types. It is internally used to distinguish the stored values, and the functions is_null
, is_object
, is_array
, is_string
, is_boolean
, is_number
(with is_number_integer
, is_number_unsigned
, and is_number_float
), is_discarded
, is_binary
, is_primitive
, and is_structured
rely on it.
!!! note “Ordering”
The order of types is as follows: 1. `null` 2. `boolean` 3. `number_integer`, `number_unsigned`, `number_float` 4. `object` 5. `array` 6. `string` 7. `binary` `discarded` is unordered.
!!! note “Types of numbers”
There are three enumerators for numbers (`number_integer`, `number_unsigned`, and `number_float`) to distinguish between different types of numbers: - [`number_unsigned_t`](number_unsigned_t.md) for unsigned integers - [`number_integer_t`](number_integer_t.md) for signed integers - [`number_float_t`](number_float_t.md) for floating-point numbers or to approximate integers which do not fit into the limits of their respective type
!!! warning “Comparison operators”
`operator<` and `operator<=>` (since C++20) are overloaded and compare according to the ordering described above. Until C++20 all other relational and equality operators yield results according to the integer value of each enumerator. Since C++20 some compilers consider the _rewritten candidates_ generated from `operator<=>` during overload resolution, while others do not. For predictable and portable behavior use: - `operator<` or `operator<=>` when wanting to compare according to the order described above - `operator==` or `operator!=` when wanting to compare according to each enumerators integer value
??? example
The following code how `type()` queries the `value_t` for all JSON types. ```cpp --8<-- "examples/type.cpp" ``` Output: ```json --8<-- "examples/type.output" ```