Skip to content

# nlohmann::basic_json::operator ValueType

    template<typename ValueType>
    JSON_EXPLICIT operator ValueType() const;

Implicit type conversion between the JSON value and a compatible value. The call is realized by calling `get()`. See Notes for the meaning of `JSON_EXPLICIT`.

## Template parameters

`ValueType`
  the value type to return

## Return value

copy of the JSON value, converted to `ValueType`

## Exceptions

Depends on what `json_serializer<ValueType>` `from_json()` method throws

## Complexity

Linear in the size of the JSON value.

## Notes

Definition of `JSON_EXPLICIT`

By default `JSON_EXPLICIT` is defined to the empty string, so the signature is:

    template<typename ValueType>
    operator ValueType() const;

If `JSON_USE_IMPLICIT_CONVERSIONS` is set to `0`, `JSON_EXPLICIT` is defined to `explicit`:

    template<typename ValueType>
    explicit operator ValueType() const;

That is, implicit conversions can be switched off by defining `JSON_USE_IMPLICIT_CONVERSIONS` to `0`.

Future behavior change

Implicit conversions will be switched off by default in the next major release of the library. That is, `JSON_EXPLICIT` will be set to `explicit` by default.

You can prepare existing code by already defining `JSON_USE_IMPLICIT_CONVERSIONS` to `0` and replace any implicit conversions with calls to `get`.

## Examples

Example

The example below shows several conversions from JSON values to other types. There are a few things to note: (1) Floating-point numbers can be converted to integers, (2) A JSON array can be converted to a standard `std::vector<short>`, (3) A JSON object can be converted to C++ associative containers such as `std::unordered_map<std::string, json>`.

    #include <iostream>
    #include <unordered_map>
    #include <nlohmann/json.hpp>

    using json = nlohmann::json;

    int main()
    {
        // create a JSON value with different types
        json json_types =
        {
            {"boolean", true},
            {
                "number", {
                    {"integer", 42},
                    {"floating-point", 17.23}
                }
            },
            {"string", "Hello, world!"},
            {"array", {1, 2, 3, 4, 5}},
            {"null", nullptr}
        };

        // use implicit conversions
        bool v1 = json_types["boolean"];
        int v2 = json_types["number"]["integer"];
        short v3 = json_types["number"]["integer"];
        float v4 = json_types["number"]["floating-point"];
        int v5 = json_types["number"]["floating-point"];
        std::string v6 = json_types["string"];
        std::vector<short> v7 = json_types["array"];
        std::unordered_map<std::string, json> v8 = json_types;

        // print the conversion results
        std::cout << v1 << '\n';
        std::cout << v2 << ' ' << v3 << '\n';
        std::cout << v4 << ' ' << v5 << '\n';
        std::cout << v6 << '\n';

        for (auto i : v7)
        {
            std::cout << i << ' ';
        }
        std::cout << "\n\n";

        for (auto i : v8)
        {
            std::cout << i.first << ": " << i.second << '\n';
        }

        // example for an exception
        try
        {
            bool v1 = json_types["string"];
        }
        catch (json::type_error& e)
        {
            std::cout << e.what() << '\n';
        }
    }

Output:

    1
    42 42
    17.23 17
    Hello, world!
    1 2 3 4 5

    string: "Hello, world!"
    number: {"floating-point":17.23,"integer":42}
    null: null
    boolean: true
    array: [1,2,3,4,5]
    [json.exception.type_error.302] type must be boolean, but is string

## Version history

- Since version 1.0.0.
- Macros `JSON_EXPLICIT`/`JSON_USE_IMPLICIT_CONVERSIONS` added in version 3.9.0.

Last update: July 31, 2022
Back to top