docs: state what the converting constructor does on a string/key mismatch (#6092)

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
Niels Lohmann authored and GitHub committed 2026-11-11 22:33:11 +01:00
1 parent abab6f2f76
commit a7b377e9ec
4 files changed
+38 -20

No files matched your search

+12 -4
View File
@@ -93,10 +93,18 @@ basic_json(basic_json&& other) noexcept;
The constructor tries to convert the internal `m_value` of the parameter. Each member value (object, array, string,
etc.) is serialized via the corresponding `to_json()` overload. For objects and strings, the conversion requires
that the *target* `basic_json` type's `object_t::key_type` (or `string_t`) be directly constructible from the
*source* type's corresponding member type via `is_constructible`. If this requirement is not met, the conversion
does not fail to compile; instead, it silently falls back to the array-conversion path, which represents objects
as arrays of `[key, value]` pairs and strings as arrays of character codes. This is a known limitation tracked in
[issue #3425](https://github.com/nlohmann/json/issues/3425).
*source* type's corresponding member type via `is_constructible`. If this requirement is not met, the result
depends on the *source* string type:
- If it is a range of characters (it has `begin()` and `end()`, as `std::string` does), the conversion falls back to
the array-conversion path, which represents objects as arrays of `[key, value]` pairs and strings as arrays of
character codes. This result has a different type than the source value, so the constructor's
[`JSON_ASSERT`](../macros/json_assert.md) fails; with its default definition, `assert`, the program aborts unless
`NDEBUG` is defined, in which case the array is returned.
- Otherwise, the conversion does not compile, even though `#!cpp std::is_constructible` reports `#!cpp true`; for
example, when converting a `basic_json` whose `string_t` is the `alt_string` of the unit tests to `json`.
This is a known limitation tracked in [issue #3425](https://github.com/nlohmann/json/issues/3425).
5. Creates a JSON value of type array or object from the passed initializer list `init`. In case `type_deduction` is
`#!cpp true` (default), the type of the JSON value to be created is deducted from the initializer list `init`
+6 -3
View File
@@ -102,9 +102,12 @@ objects.
When converting an object from one `basic_json` specialization to another via the
[converting constructor](basic_json.md) (overload 4), the target `object_t`'s `key_type` must be
directly constructible from the source `basic_json`'s `string_t` type (or more generally, from the
source object's key type). If this requirement is not met, the conversion does not fail; instead,
the object is silently converted as an array of key-value pairs, which is incorrect. See
directly constructible from the source object's key type (with the default `std::map`, the source `basic_json`'s
`string_t`). If this requirement is not met and the source string type is a range of characters, the
object is converted as an array of key-value pairs, which is incorrect: the converting constructor's
[`JSON_ASSERT`](../macros/json_assert.md) fails; with its default definition, `assert`, the program aborts unless
`NDEBUG` is defined, in which case the array is returned. If the source string type is not a range of characters, the
conversion does not compile at all. See [`basic_json`](basic_json.md) and
[issue #3425](https://github.com/nlohmann/json/issues/3425) for details and an example.
## Examples
+5 -3
View File
@@ -60,9 +60,11 @@ String values are stored as pointers in a `basic_json` type. That is, for any ac
When converting a string value from one `basic_json` specialization to another via the
[converting constructor](basic_json.md) (overload 4), the target `string_t` must be directly
constructible from the source `basic_json`'s `string_t` type. If this requirement is not met, the
conversion does not fail; instead, the string is silently converted as an array of character codes,
which is incorrect. See [issue #3425](https://github.com/nlohmann/json/issues/3425) for details
and an example.
conversion depends on the source string type. If it is a range of characters, the string is converted as an array of
character codes, which is incorrect: the converting constructor's [`JSON_ASSERT`](../macros/json_assert.md) fails; with
its default definition, `assert`, the program aborts unless `NDEBUG` is defined, in which case the array is returned.
If the source string type is not a range of characters, the conversion does not compile at all. See
[issue #3425](https://github.com/nlohmann/json/issues/3425) for details and an example.
## Examples