# end_pos - JSON for Modern C++
Author: Niels Lohmann

Skip to content

# nlohmann::basic_json::end_pos

    #if JSON_DIAGNOSTIC_POSITIONS
    constexpr std::size_t end_pos() const noexcept;
    #endif

Returns the position immediately following the last character of the JSON string from which the value was parsed from.

JSON type | return value
--- | ---
object | position after the closing `}`
array | position after the closing `]`
string | position after the closing `"`
number | position after the last character
boolean | position after `e`
null | position after `l`

## Return value

the position of the character following the last character of the given value in the parsed JSON string, if the value was created by the `parse` function, or `std::string::npos` if the value was constructed otherwise

## Exception safety

No-throw guarantee: this member function never throws exceptions.

## Complexity

Constant.

## Notes

Note

The function is only available if macro `JSON_DIAGNOSTIC_POSITIONS` has been defined to `1` before including the library header.

Invalidation

The returned positions are only valid as long as the JSON value is not changed. The positions are not updated when the JSON value is changed.

## Examples

Example

    #include <iostream>

    #define JSON_DIAGNOSTIC_POSITIONS 1
    #include <nlohmann/json.hpp>

    using json = nlohmann::json;

    int main()
    {
        std::string json_string = R"(
        {
            "address": {
                "street": "Fake Street",
                "housenumber": 1
            }
        }
        )";
        json j = json::parse(json_string);

        std::cout << "Root diagnostic positions: \n";
        std::cout << "\tstart_pos: " << j.start_pos() << '\n';
        std::cout << "\tend_pos:" << j.end_pos() << "\n";
        std::cout << "Original string: \n";
        std::cout << "{\n        \"address\": {\n            \"street\": \"Fake Street\",\n            \"housenumber\": 1\n        }\n    }" << "\n";
        std::cout << "Parsed string: \n";
        std::cout << json_string.substr(j.start_pos(), j.end_pos() - j.start_pos()) << "\n\n";

        std::cout << "address diagnostic positions: \n";
        std::cout << "\tstart_pos:" << j["address"].start_pos() << '\n';
        std::cout << "\tend_pos:" << j["address"].end_pos() << "\n\n";
        std::cout << "Original string: \n";
        std::cout << "{            \"street\": \"Fake Street\",\n            \"housenumber\": 1\n        }" << "\n";
        std::cout << "Parsed string: \n";
        std::cout << json_string.substr(j["address"].start_pos(), j["address"].end_pos() - j["address"].start_pos()) << "\n\n";

        std::cout << "street diagnostic positions: \n";
        std::cout << "\tstart_pos:" << j["address"]["street"].start_pos() << '\n';
        std::cout << "\tend_pos:" << j["address"]["street"].end_pos() << "\n\n";
        std::cout << "Original string: \n";
        std::cout << "\"Fake Street\"" << "\n";
        std::cout << "Parsed string: \n";
        std::cout << json_string.substr(j["address"]["street"].start_pos(), j["address"]["street"].end_pos() - j["address"]["street"].start_pos()) << "\n\n";

        std::cout << "housenumber diagnostic positions: \n";
        std::cout << "\tstart_pos:" << j["address"]["housenumber"].start_pos() << '\n';
        std::cout << "\tend_pos:" << j["address"]["housenumber"].end_pos() << "\n\n";
        std::cout << "Original string: \n";
        std::cout << "1" << "\n";
        std::cout << "Parsed string: \n";
        std::cout << json_string.substr(j["address"]["housenumber"].start_pos(), j["address"]["housenumber"].end_pos() - j["address"]["housenumber"].start_pos()) << "\n\n";
    }

Output:

    Root diagnostic positions:
        start_pos: 5
        end_pos:109
    Original string:
    {
            "address": {
                "street": "Fake Street",
                "housenumber": 1
            }
        }
    Parsed string:
    {
            "address": {
                "street": "Fake Street",
                "housenumber": 1
            }
        }

    address diagnostic positions:
        start_pos:26
        end_pos:103

    Original string:
    {            "street": "Fake Street",
                "housenumber": 1
            }
    Parsed string:
    {
                "street": "Fake Street",
                "housenumber": 1
            }

    street diagnostic positions:
        start_pos:50
        end_pos:63

    Original string:
    "Fake Street"
    Parsed string:
    "Fake Street"

    housenumber diagnostic positions:
        start_pos:92
        end_pos:93

    Original string:
    1
    Parsed string:
    1

The output shows the start/end positions of all the objects and fields in the JSON string.

## See also

- start_pos to access the start position
- JSON_DIAGNOSTIC_POSITIONS for an overview of the diagnostic positions

## Version history

- Added in version 3.12.0.

January 1, 2026