mirror of
https://github.com/nlohmann/json.git
synced 2026-10-05 14:10:31 +00:00
Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ab8fa9341 | ||
|
|
ea72ffe0a3 | ||
|
|
7e4b496811 | ||
|
|
97f724951b | ||
|
|
c7a0d59e16 |
@@ -109,6 +109,9 @@ The class satisfies the following concept requirements:
|
|||||||
- **initializer_list_t** - type for initializer lists of `basic_json` values
|
- **initializer_list_t** - type for initializer lists of `basic_json` values
|
||||||
- [**input_format_t**](input_format_t.md) - type to choose the format to parse
|
- [**input_format_t**](input_format_t.md) - type to choose the format to parse
|
||||||
- [**json_sax_t**](../json_sax/index.md) - type for SAX events
|
- [**json_sax_t**](../json_sax/index.md) - type for SAX events
|
||||||
|
- [**with_object_t, with_array_t, with_string_t, with_boolean_t, with_integers_t, with_float_t, with_allocator_t,
|
||||||
|
with_json_serializer_t, with_binary_t, with_base_class_t**](with_t.md) - types to create a `basic_json` type with
|
||||||
|
one (or two) replaced template parameters
|
||||||
|
|
||||||
### Exceptions
|
### Exceptions
|
||||||
|
|
||||||
|
|||||||
@@ -68,8 +68,6 @@ Strong guarantee: if an exception is thrown, there are no changes in the JSON va
|
|||||||
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key in `j` is
|
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key in `j` is
|
||||||
not valid UTF-8 and `error_handler` is `strict` (the default only if
|
not valid UTF-8 and `error_handler` is `strict` (the default only if
|
||||||
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled)
|
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled)
|
||||||
- Throws [type_error.321](../../home/exceptions.md#jsonexceptiontype_error321) if `j` or a value nested in it is
|
|
||||||
discarded; example: `"cannot serialize discarded value to BJData"`
|
|
||||||
|
|
||||||
## Complexity
|
## Complexity
|
||||||
|
|
||||||
@@ -121,6 +119,4 @@ Linear in the size of the JSON value `j`.
|
|||||||
- BJData version parameter (for draft3 binary encoding) added in version 3.12.0.
|
- BJData version parameter (for draft3 binary encoding) added in version 3.12.0.
|
||||||
- Added `error_handler` parameter in version 3.13.0. Its default, `keep`, writes the bytes of a string or object key
|
- Added `error_handler` parameter in version 3.13.0. Its default, `keep`, writes the bytes of a string or object key
|
||||||
that is not valid UTF-8 unchanged, as before; `strict` (the default if
|
that is not valid UTF-8 unchanged, as before; `strict` (the default if
|
||||||
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled) throws `type_error.316`.
|
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled) throws `type_error.316`.
|
||||||
- Throws `type_error.321` for a discarded value since version 3.13.0; previously, a discarded value nested in an
|
|
||||||
array or object was silently skipped, producing invalid BJData.
|
|
||||||
@@ -58,9 +58,6 @@ Strong guarantee: if an exception is thrown, there are no changes in the JSON va
|
|||||||
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key is
|
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key is
|
||||||
not valid UTF-8 and `error_handler` is `strict` (the default only if
|
not valid UTF-8 and `error_handler` is `strict` (the default only if
|
||||||
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled)
|
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled)
|
||||||
- Throws [type_error.321](../../home/exceptions.md#jsonexceptiontype_error321) if a value nested in `j` is discarded
|
|
||||||
(the top-level value itself is covered by `type_error.317` above, since it must be an object); example:
|
|
||||||
`"cannot serialize discarded value to BSON"`
|
|
||||||
|
|
||||||
## Complexity
|
## Complexity
|
||||||
|
|
||||||
@@ -113,8 +110,6 @@ pass before anything is written.
|
|||||||
- Throws `out_of_range.412` and `out_of_range.415` since version 3.13.0.
|
- Throws `out_of_range.412` and `out_of_range.415` since version 3.13.0.
|
||||||
- Linear in the size of `j`, and no longer limited by the call stack for deeply nested values, since version 3.13.0.
|
- Linear in the size of `j`, and no longer limited by the call stack for deeply nested values, since version 3.13.0.
|
||||||
- `out_of_range.415` is now detected before anything is written, like the other exceptions above, since version 3.13.0.
|
- `out_of_range.415` is now detected before anything is written, like the other exceptions above, since version 3.13.0.
|
||||||
- Throws `type_error.321` for a discarded value nested in `j` since version 3.13.0; previously, it was silently
|
|
||||||
skipped, producing a document whose declared size did not match what was actually written.
|
|
||||||
- Added `error_handler` parameter in version 3.13.0. Its default, `keep`, writes the bytes of a string or object key
|
- Added `error_handler` parameter in version 3.13.0. Its default, `keep`, writes the bytes of a string or object key
|
||||||
that is not valid UTF-8 unchanged, as before; `strict` (the default if
|
that is not valid UTF-8 unchanged, as before; `strict` (the default if
|
||||||
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled) throws `type_error.316` before anything
|
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled) throws `type_error.316` before anything
|
||||||
|
|||||||
@@ -49,8 +49,6 @@ Strong guarantee: if an exception is thrown, there are no changes in the JSON va
|
|||||||
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key in `j` is
|
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key in `j` is
|
||||||
not valid UTF-8 and `error_handler` is `strict` (the default only if
|
not valid UTF-8 and `error_handler` is `strict` (the default only if
|
||||||
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled)
|
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled)
|
||||||
- Throws [type_error.321](../../home/exceptions.md#jsonexceptiontype_error321) if `j` or a value nested in it is
|
|
||||||
discarded; example: `"cannot serialize discarded value to CBOR"`
|
|
||||||
|
|
||||||
## Complexity
|
## Complexity
|
||||||
|
|
||||||
@@ -88,5 +86,3 @@ Linear in the size of the JSON value `j`.
|
|||||||
- Added `error_handler` parameter in version 3.13.0. Its default, `keep`, writes the bytes of a string or object key
|
- Added `error_handler` parameter in version 3.13.0. Its default, `keep`, writes the bytes of a string or object key
|
||||||
that is not valid UTF-8 unchanged, as before; `strict` (the default if
|
that is not valid UTF-8 unchanged, as before; `strict` (the default if
|
||||||
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled) throws `type_error.316`.
|
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled) throws `type_error.316`.
|
||||||
- Throws `type_error.321` for a discarded value since version 3.13.0; previously, a discarded value nested in an
|
|
||||||
array or object was silently skipped, producing invalid CBOR.
|
|
||||||
|
|||||||
@@ -54,8 +54,6 @@ Strong guarantee: if an exception is thrown, there are no changes in the JSON va
|
|||||||
`"subtype 70000 is too large for the MessagePack ext type (max 255)"`
|
`"subtype 70000 is too large for the MessagePack ext type (max 255)"`
|
||||||
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key in `j` is
|
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key in `j` is
|
||||||
not valid UTF-8 and `error_handler` is `strict`
|
not valid UTF-8 and `error_handler` is `strict`
|
||||||
- Throws [type_error.321](../../home/exceptions.md#jsonexceptiontype_error321) if `j` or a value nested in it is
|
|
||||||
discarded; example: `"cannot serialize discarded value to MessagePack"`
|
|
||||||
|
|
||||||
## Complexity
|
## Complexity
|
||||||
|
|
||||||
@@ -110,5 +108,3 @@ Linear in the size of the JSON value `j`.
|
|||||||
- Fixed in version 3.13.0 to serialize `number_integer_t`/`number_unsigned_t` pairs of different width correctly;
|
- Fixed in version 3.13.0 to serialize `number_integer_t`/`number_unsigned_t` pairs of different width correctly;
|
||||||
before, integers could be serialized with the wrong value if `number_integer_t` was narrower than
|
before, integers could be serialized with the wrong value if `number_integer_t` was narrower than
|
||||||
`number_unsigned_t`.
|
`number_unsigned_t`.
|
||||||
- Throws `type_error.321` for a discarded value since version 3.13.0; previously, a discarded value nested in an
|
|
||||||
array or object was silently skipped, producing invalid MessagePack.
|
|
||||||
|
|||||||
@@ -61,8 +61,6 @@ Strong guarantee: if an exception is thrown, there are no changes in the JSON va
|
|||||||
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key in `j` is
|
- Throws [type_error.316](../../home/exceptions.md#jsonexceptiontype_error316) if a string or object key in `j` is
|
||||||
not valid UTF-8 and `error_handler` is `strict` (the default only if
|
not valid UTF-8 and `error_handler` is `strict` (the default only if
|
||||||
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled)
|
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled)
|
||||||
- Throws [type_error.321](../../home/exceptions.md#jsonexceptiontype_error321) if `j` or a value nested in it is
|
|
||||||
discarded; example: `"cannot serialize discarded value to UBJSON"`
|
|
||||||
|
|
||||||
## Complexity
|
## Complexity
|
||||||
|
|
||||||
@@ -114,5 +112,3 @@ Linear in the size of the JSON value `j`.
|
|||||||
- Added `error_handler` parameter in version 3.13.0. Its default, `keep`, writes the bytes of a string or object key
|
- Added `error_handler` parameter in version 3.13.0. Its default, `keep`, writes the bytes of a string or object key
|
||||||
that is not valid UTF-8 unchanged, as before; `strict` (the default if
|
that is not valid UTF-8 unchanged, as before; `strict` (the default if
|
||||||
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled) throws `type_error.316`.
|
[`JSON_STRICT_BINARY_UTF8`](../macros/json_strict_binary_utf8.md) is enabled) throws `type_error.316`.
|
||||||
- Throws `type_error.321` for a discarded value since version 3.13.0; previously, a discarded value nested in an
|
|
||||||
array or object was silently skipped, producing invalid UBJSON.
|
|
||||||
|
|||||||
@@ -0,0 +1,136 @@
|
|||||||
|
# <small>nlohmann::basic_json::</small>with_t
|
||||||
|
|
||||||
|
Member alias templates `with_object_t`, `with_array_t`, `with_string_t`, `with_boolean_t`, `with_integers_t`,
|
||||||
|
`with_float_t`, `with_allocator_t`, `with_json_serializer_t`, `with_binary_t`, and `with_base_class_t`.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
template<template<typename, typename, typename...> class ObjectType2>
|
||||||
|
using with_object_t = basic_json<ObjectType2, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType,
|
||||||
|
AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
template<template<typename, typename...> class ArrayType2>
|
||||||
|
using with_array_t = basic_json<ObjectType, ArrayType2, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType,
|
||||||
|
AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
template<class StringType2>
|
||||||
|
using with_string_t = basic_json<ObjectType, ArrayType, StringType2, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType,
|
||||||
|
AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
template<class BooleanType2>
|
||||||
|
using with_boolean_t = basic_json<ObjectType, ArrayType, StringType, BooleanType2,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType,
|
||||||
|
AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
template<class NumberIntegerType2, class NumberUnsignedType2>
|
||||||
|
using with_integers_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType2, NumberUnsignedType2, NumberFloatType,
|
||||||
|
AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
template<class NumberFloatType2>
|
||||||
|
using with_float_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType2,
|
||||||
|
AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
template<template<typename> class AllocatorType2>
|
||||||
|
using with_allocator_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType,
|
||||||
|
AllocatorType2, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
template<template<typename, typename = void> class JSONSerializer2>
|
||||||
|
using with_json_serializer_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType,
|
||||||
|
AllocatorType, JSONSerializer2, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
template<class BinaryType2>
|
||||||
|
using with_binary_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType,
|
||||||
|
AllocatorType, JSONSerializer, BinaryType2, CustomBaseClass>;
|
||||||
|
|
||||||
|
template<class CustomBaseClass2>
|
||||||
|
using with_base_class_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType,
|
||||||
|
AllocatorType, JSONSerializer, BinaryType, CustomBaseClass2>;
|
||||||
|
```
|
||||||
|
|
||||||
|
These member alias templates make it easier to create a `basic_json` type that is identical to the current type except
|
||||||
|
for one (or, in the case of `with_integers_t`, two) of its [template parameters](index.md#template-parameters).
|
||||||
|
Spelling out all 11 template parameters of `basic_json` just to change a single one is verbose and error-prone; these
|
||||||
|
aliases only require the replacement type(s).
|
||||||
|
|
||||||
|
with_object_t<ObjectType2>
|
||||||
|
: replaces `ObjectType`
|
||||||
|
|
||||||
|
with_array_t<ArrayType2>
|
||||||
|
: replaces `ArrayType`
|
||||||
|
|
||||||
|
with_string_t<StringType2>
|
||||||
|
: replaces `StringType`
|
||||||
|
|
||||||
|
with_boolean_t<BooleanType2>
|
||||||
|
: replaces `BooleanType`
|
||||||
|
|
||||||
|
with_integers_t<NumberIntegerType2, NumberUnsignedType2>
|
||||||
|
: replaces both `NumberIntegerType` and `NumberUnsignedType`; the two are combined into a single alias because they
|
||||||
|
are usually changed together (for instance, when switching to fixed-width integer types)
|
||||||
|
|
||||||
|
with_float_t<NumberFloatType2>
|
||||||
|
: replaces `NumberFloatType`
|
||||||
|
|
||||||
|
with_allocator_t<AllocatorType2>
|
||||||
|
: replaces `AllocatorType`
|
||||||
|
|
||||||
|
with_json_serializer_t<JSONSerializer2>
|
||||||
|
: replaces `JSONSerializer`
|
||||||
|
|
||||||
|
with_binary_t<BinaryType2>
|
||||||
|
: replaces `BinaryType`
|
||||||
|
|
||||||
|
with_base_class_t<CustomBaseClass2>
|
||||||
|
: replaces `CustomBaseClass`; see also [`json_base_class_t`](json_base_class_t.md)
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
All other template parameters are kept unchanged, so the resulting type still uses, for instance, the same
|
||||||
|
`ObjectType` unless `with_object_t` itself is used.
|
||||||
|
|
||||||
|
The aliases are members of every `basic_json` specialization, including [`ordered_json`](../ordered_json.md), and the
|
||||||
|
type they produce is again a `basic_json` specialization. They can therefore be chained to replace several template
|
||||||
|
parameters at once:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
using my_json = nlohmann::json::with_integers_t<int, unsigned int>::with_float_t<float>;
|
||||||
|
using my_ordered_json = nlohmann::ordered_json::with_string_t<std::wstring>;
|
||||||
|
```
|
||||||
|
|
||||||
|
The result is the same type as spelling out all template parameters, so the order of the chained aliases does not
|
||||||
|
matter. For instance, `nlohmann::json::with_object_t<nlohmann::ordered_map>` is `nlohmann::ordered_json`.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
??? example
|
||||||
|
|
||||||
|
The following code shows how `with_object_t` can be used to create a JSON type that stores object elements in a
|
||||||
|
`std::map` and therefore keeps them sorted by key, unlike the default type which preserves insertion order
|
||||||
|
only when `nlohmann::ordered_json` is used.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
--8<-- "examples/with_t.cpp"
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
```json
|
||||||
|
--8<-- "examples/with_t.output"
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
- [basic_json](index.md#template-parameters) - the template parameters that can be replaced
|
||||||
|
- [json_base_class_t](json_base_class_t.md) - the type used for `CustomBaseClass`
|
||||||
|
|
||||||
|
## Version history
|
||||||
|
|
||||||
|
- Added in version 3.13.0.
|
||||||
@@ -13,19 +13,7 @@ class visitor_adaptor_with_metadata
|
|||||||
void do_visit(const Ptr& ptr, const Fnc& fnc) const;
|
void do_visit(const Ptr& ptr, const Fnc& fnc) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
using json = nlohmann::basic_json <
|
using json = nlohmann::json::with_base_class_t<visitor_adaptor_with_metadata>;
|
||||||
std::map,
|
|
||||||
std::vector,
|
|
||||||
std::string,
|
|
||||||
bool,
|
|
||||||
std::int64_t,
|
|
||||||
std::uint64_t,
|
|
||||||
double,
|
|
||||||
std::allocator,
|
|
||||||
nlohmann::adl_serializer,
|
|
||||||
std::vector<std::uint8_t>,
|
|
||||||
visitor_adaptor_with_metadata
|
|
||||||
>;
|
|
||||||
|
|
||||||
template <class Fnc>
|
template <class Fnc>
|
||||||
void visitor_adaptor_with_metadata::visit(const Fnc& fnc) const
|
void visitor_adaptor_with_metadata::visit(const Fnc& fnc) const
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
|
// a JSON type that stores objects in a std::map (which keeps keys sorted)
|
||||||
|
// instead of the default ordered associative container
|
||||||
|
using sorted_json = nlohmann::json::with_object_t<std::map>;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
sorted_json j;
|
||||||
|
j["c"] = 1;
|
||||||
|
j["a"] = 2;
|
||||||
|
j["b"] = 3;
|
||||||
|
|
||||||
|
// keys are sorted, because std::map is used to store the object
|
||||||
|
std::cout << j.dump() << std::endl;
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"a":2,"b":3,"c":1}
|
||||||
@@ -804,20 +804,6 @@ does not list an enumerator and it is therefore converted like the first listed
|
|||||||
[json.exception.type_error.318] duplicate object key 'red'
|
[json.exception.type_error.318] duplicate object key 'red'
|
||||||
```
|
```
|
||||||
|
|
||||||
### json.exception.type_error.321
|
|
||||||
|
|
||||||
A discarded value (one created by [`parse()`](../api/basic_json/parse.md) with a callback that returns `false` for the
|
|
||||||
value, or by default-constructing a [`basic_json`](../api/basic_json/index.md) with
|
|
||||||
[`value_t::discarded`](../api/basic_json/value_t.md)) was passed to a binary serialization function, either directly or
|
|
||||||
nested in an array or object. There is no way to represent a discarded value in CBOR, MessagePack, UBJSON, BJData, or BSON.
|
|
||||||
|
|
||||||
!!! failure "Example message"
|
|
||||||
|
|
||||||
Serializing `#!json [1, 2]` to CBOR, where the second element was discarded by a parser callback:
|
|
||||||
```
|
|
||||||
[json.exception.type_error.321] cannot serialize discarded value to CBOR
|
|
||||||
```
|
|
||||||
|
|
||||||
## Out of range
|
## Out of range
|
||||||
|
|
||||||
This exception is thrown in case a library function is called on an input parameter that exceeds the expected range, for instance, in the case of array indices or nonexisting object keys.
|
This exception is thrown in case a library function is called on an input parameter that exceeds the expected range, for instance, in the case of array indices or nonexisting object keys.
|
||||||
|
|||||||
@@ -232,6 +232,7 @@ nav:
|
|||||||
- 'update': api/basic_json/update.md
|
- 'update': api/basic_json/update.md
|
||||||
- 'value': api/basic_json/value.md
|
- 'value': api/basic_json/value.md
|
||||||
- 'value_t': api/basic_json/value_t.md
|
- 'value_t': api/basic_json/value_t.md
|
||||||
|
- 'with_t': api/basic_json/with_t.md
|
||||||
- byte_container_with_subtype:
|
- byte_container_with_subtype:
|
||||||
- 'Overview': api/byte_container_with_subtype/index.md
|
- 'Overview': api/byte_container_with_subtype/index.md
|
||||||
- '(constructor)': api/byte_container_with_subtype/byte_container_with_subtype.md
|
- '(constructor)': api/byte_container_with_subtype/byte_container_with_subtype.md
|
||||||
|
|||||||
@@ -127,7 +127,6 @@ class binary_writer
|
|||||||
@throw type_error.316 if a string value or an object key is not valid
|
@throw type_error.316 if a string value or an object key is not valid
|
||||||
UTF-8
|
UTF-8
|
||||||
@throw type_error.317 if @a j is not an object
|
@throw type_error.317 if @a j is not an object
|
||||||
@throw type_error.321 if a value nested in @a j is discarded
|
|
||||||
*/
|
*/
|
||||||
void write_bson(const BasicJsonType& j)
|
void write_bson(const BasicJsonType& j)
|
||||||
{
|
{
|
||||||
@@ -159,7 +158,6 @@ class binary_writer
|
|||||||
@param[in] j JSON value to serialize
|
@param[in] j JSON value to serialize
|
||||||
@throw type_error.316 if a string value or an object key is not valid
|
@throw type_error.316 if a string value or an object key is not valid
|
||||||
UTF-8
|
UTF-8
|
||||||
@throw type_error.321 if @a j or a value nested in it is discarded
|
|
||||||
*/
|
*/
|
||||||
void write_cbor(const BasicJsonType& j)
|
void write_cbor(const BasicJsonType& j)
|
||||||
{
|
{
|
||||||
@@ -324,7 +322,7 @@ class binary_writer
|
|||||||
|
|
||||||
case value_t::discarded:
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
throw_on_discarded(j, "CBOR");
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,7 +382,6 @@ class binary_writer
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
@param[in] j JSON value to serialize
|
@param[in] j JSON value to serialize
|
||||||
@throw type_error.321 if @a j or a value nested in it is discarded
|
|
||||||
*/
|
*/
|
||||||
void write_msgpack(const BasicJsonType& j)
|
void write_msgpack(const BasicJsonType& j)
|
||||||
{
|
{
|
||||||
@@ -658,7 +655,7 @@ class binary_writer
|
|||||||
|
|
||||||
case value_t::discarded:
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
throw_on_discarded(j, "MessagePack");
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -671,7 +668,6 @@ class binary_writer
|
|||||||
@param[in] bjdata_version which BJData version to use, default is draft2
|
@param[in] bjdata_version which BJData version to use, default is draft2
|
||||||
@throw type_error.316 if a string value or an object key is not valid
|
@throw type_error.316 if a string value or an object key is not valid
|
||||||
UTF-8
|
UTF-8
|
||||||
@throw type_error.321 if @a j or a value nested in it is discarded
|
|
||||||
*/
|
*/
|
||||||
void write_ubjson(const BasicJsonType& j, const bool use_count,
|
void write_ubjson(const BasicJsonType& j, const bool use_count,
|
||||||
const bool use_type, const bool add_prefix = true,
|
const bool use_type, const bool add_prefix = true,
|
||||||
@@ -905,7 +901,7 @@ class binary_writer
|
|||||||
|
|
||||||
case value_t::discarded:
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
throw_on_discarded(j, use_bjdata ? "BJData" : "UBJSON");
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -925,15 +921,6 @@ class binary_writer
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*!
|
|
||||||
@brief throws because @a j is discarded and cannot be serialized
|
|
||||||
@throw type_error.321 always
|
|
||||||
*/
|
|
||||||
JSON_HEDLEY_NO_RETURN static void throw_on_discarded(const BasicJsonType& j, const char* format_name)
|
|
||||||
{
|
|
||||||
JSON_THROW(type_error::create(321, concat("cannot serialize discarded value to ", format_name), &j));
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////
|
//////////
|
||||||
// BSON //
|
// BSON //
|
||||||
//////////
|
//////////
|
||||||
@@ -1185,7 +1172,6 @@ class binary_writer
|
|||||||
into a byte, before anything is written
|
into a byte, before anything is written
|
||||||
@throw type_error.316 if @a j is a string that is not valid UTF-8, before
|
@throw type_error.316 if @a j is a string that is not valid UTF-8, before
|
||||||
anything is written
|
anything is written
|
||||||
@throw type_error.321 if @a j is discarded
|
|
||||||
*/
|
*/
|
||||||
std::size_t calc_bson_value_size(const BasicJsonType& j)
|
std::size_t calc_bson_value_size(const BasicJsonType& j)
|
||||||
{
|
{
|
||||||
@@ -1212,12 +1198,10 @@ class binary_writer
|
|||||||
case value_t::null:
|
case value_t::null:
|
||||||
return 0ul;
|
return 0ul;
|
||||||
|
|
||||||
case value_t::discarded:
|
|
||||||
throw_on_discarded(j, "BSON");
|
|
||||||
|
|
||||||
// LCOV_EXCL_START
|
// LCOV_EXCL_START
|
||||||
case value_t::object:
|
case value_t::object:
|
||||||
case value_t::array:
|
case value_t::array:
|
||||||
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
|
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
|
||||||
return 0ul;
|
return 0ul;
|
||||||
@@ -1254,12 +1238,10 @@ class binary_writer
|
|||||||
case value_t::null:
|
case value_t::null:
|
||||||
return write_bson_null(name);
|
return write_bson_null(name);
|
||||||
|
|
||||||
case value_t::discarded:
|
|
||||||
throw_on_discarded(j, "BSON");
|
|
||||||
|
|
||||||
// LCOV_EXCL_START
|
// LCOV_EXCL_START
|
||||||
case value_t::object:
|
case value_t::object:
|
||||||
case value_t::array:
|
case value_t::array:
|
||||||
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
|
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
|
||||||
return;
|
return;
|
||||||
@@ -1326,8 +1308,6 @@ class binary_writer
|
|||||||
byte, before anything is written
|
byte, before anything is written
|
||||||
@throw type_error.316 if a string value or a key is not valid UTF-8,
|
@throw type_error.316 if a string value or a key is not valid UTF-8,
|
||||||
before anything is written
|
before anything is written
|
||||||
@throw type_error.321 if a value nested in @a document is discarded,
|
|
||||||
before anything is written
|
|
||||||
*/
|
*/
|
||||||
std::size_t calc_bson_sizes(const BasicJsonType& document, std::vector<std::size_t>& nested_sizes)
|
std::size_t calc_bson_sizes(const BasicJsonType& document, std::vector<std::size_t>& nested_sizes)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -226,6 +226,70 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
/// SAX interface type, see @ref nlohmann::json_sax
|
/// SAX interface type, see @ref nlohmann::json_sax
|
||||||
using json_sax_t = json_sax<basic_json>;
|
using json_sax_t = json_sax<basic_json>;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// utility templates to create a json type with different template parameters //
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// Json type using a different type for storing objects
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<template<typename, typename, typename...> class ObjectType2>
|
||||||
|
using with_object_t = basic_json<ObjectType2, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing arrays
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<template<typename, typename...> class ArrayType2>
|
||||||
|
using with_array_t = basic_json<ObjectType, ArrayType2, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing strings
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class StringType2>
|
||||||
|
using with_string_t = basic_json<ObjectType, ArrayType, StringType2, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing booleans
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class BooleanType2>
|
||||||
|
using with_boolean_t = basic_json<ObjectType, ArrayType, StringType, BooleanType2,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using different types for storing signed and unsigned integers
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class NumberIntegerType2, class NumberUnsignedType2>
|
||||||
|
using with_integers_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType2, NumberUnsignedType2, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing floating point numbers
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class NumberFloatType2>
|
||||||
|
using with_float_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType2, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type as base allocator
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<template<typename> class AllocatorType2>
|
||||||
|
using with_allocator_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType2, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type as json serializer
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<template<typename, typename = void> class JSONSerializer2>
|
||||||
|
using with_json_serializer_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer2, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing binary data
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class BinaryType2>
|
||||||
|
using with_binary_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType2, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type as base class
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class CustomBaseClass2>
|
||||||
|
using with_base_class_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass2>;
|
||||||
|
|
||||||
////////////////
|
////////////////
|
||||||
// exceptions //
|
// exceptions //
|
||||||
////////////////
|
////////////////
|
||||||
|
|||||||
@@ -21529,7 +21529,6 @@ class binary_writer
|
|||||||
@throw type_error.316 if a string value or an object key is not valid
|
@throw type_error.316 if a string value or an object key is not valid
|
||||||
UTF-8
|
UTF-8
|
||||||
@throw type_error.317 if @a j is not an object
|
@throw type_error.317 if @a j is not an object
|
||||||
@throw type_error.321 if a value nested in @a j is discarded
|
|
||||||
*/
|
*/
|
||||||
void write_bson(const BasicJsonType& j)
|
void write_bson(const BasicJsonType& j)
|
||||||
{
|
{
|
||||||
@@ -21561,7 +21560,6 @@ class binary_writer
|
|||||||
@param[in] j JSON value to serialize
|
@param[in] j JSON value to serialize
|
||||||
@throw type_error.316 if a string value or an object key is not valid
|
@throw type_error.316 if a string value or an object key is not valid
|
||||||
UTF-8
|
UTF-8
|
||||||
@throw type_error.321 if @a j or a value nested in it is discarded
|
|
||||||
*/
|
*/
|
||||||
void write_cbor(const BasicJsonType& j)
|
void write_cbor(const BasicJsonType& j)
|
||||||
{
|
{
|
||||||
@@ -21726,7 +21724,7 @@ class binary_writer
|
|||||||
|
|
||||||
case value_t::discarded:
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
throw_on_discarded(j, "CBOR");
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21786,7 +21784,6 @@ class binary_writer
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
@param[in] j JSON value to serialize
|
@param[in] j JSON value to serialize
|
||||||
@throw type_error.321 if @a j or a value nested in it is discarded
|
|
||||||
*/
|
*/
|
||||||
void write_msgpack(const BasicJsonType& j)
|
void write_msgpack(const BasicJsonType& j)
|
||||||
{
|
{
|
||||||
@@ -22060,7 +22057,7 @@ class binary_writer
|
|||||||
|
|
||||||
case value_t::discarded:
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
throw_on_discarded(j, "MessagePack");
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22073,7 +22070,6 @@ class binary_writer
|
|||||||
@param[in] bjdata_version which BJData version to use, default is draft2
|
@param[in] bjdata_version which BJData version to use, default is draft2
|
||||||
@throw type_error.316 if a string value or an object key is not valid
|
@throw type_error.316 if a string value or an object key is not valid
|
||||||
UTF-8
|
UTF-8
|
||||||
@throw type_error.321 if @a j or a value nested in it is discarded
|
|
||||||
*/
|
*/
|
||||||
void write_ubjson(const BasicJsonType& j, const bool use_count,
|
void write_ubjson(const BasicJsonType& j, const bool use_count,
|
||||||
const bool use_type, const bool add_prefix = true,
|
const bool use_type, const bool add_prefix = true,
|
||||||
@@ -22307,7 +22303,7 @@ class binary_writer
|
|||||||
|
|
||||||
case value_t::discarded:
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
throw_on_discarded(j, use_bjdata ? "BJData" : "UBJSON");
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22327,15 +22323,6 @@ class binary_writer
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*!
|
|
||||||
@brief throws because @a j is discarded and cannot be serialized
|
|
||||||
@throw type_error.321 always
|
|
||||||
*/
|
|
||||||
JSON_HEDLEY_NO_RETURN static void throw_on_discarded(const BasicJsonType& j, const char* format_name)
|
|
||||||
{
|
|
||||||
JSON_THROW(type_error::create(321, concat("cannot serialize discarded value to ", format_name), &j));
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////
|
//////////
|
||||||
// BSON //
|
// BSON //
|
||||||
//////////
|
//////////
|
||||||
@@ -22587,7 +22574,6 @@ class binary_writer
|
|||||||
into a byte, before anything is written
|
into a byte, before anything is written
|
||||||
@throw type_error.316 if @a j is a string that is not valid UTF-8, before
|
@throw type_error.316 if @a j is a string that is not valid UTF-8, before
|
||||||
anything is written
|
anything is written
|
||||||
@throw type_error.321 if @a j is discarded
|
|
||||||
*/
|
*/
|
||||||
std::size_t calc_bson_value_size(const BasicJsonType& j)
|
std::size_t calc_bson_value_size(const BasicJsonType& j)
|
||||||
{
|
{
|
||||||
@@ -22614,12 +22600,10 @@ class binary_writer
|
|||||||
case value_t::null:
|
case value_t::null:
|
||||||
return 0ul;
|
return 0ul;
|
||||||
|
|
||||||
case value_t::discarded:
|
|
||||||
throw_on_discarded(j, "BSON");
|
|
||||||
|
|
||||||
// LCOV_EXCL_START
|
// LCOV_EXCL_START
|
||||||
case value_t::object:
|
case value_t::object:
|
||||||
case value_t::array:
|
case value_t::array:
|
||||||
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
|
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
|
||||||
return 0ul;
|
return 0ul;
|
||||||
@@ -22656,12 +22640,10 @@ class binary_writer
|
|||||||
case value_t::null:
|
case value_t::null:
|
||||||
return write_bson_null(name);
|
return write_bson_null(name);
|
||||||
|
|
||||||
case value_t::discarded:
|
|
||||||
throw_on_discarded(j, "BSON");
|
|
||||||
|
|
||||||
// LCOV_EXCL_START
|
// LCOV_EXCL_START
|
||||||
case value_t::object:
|
case value_t::object:
|
||||||
case value_t::array:
|
case value_t::array:
|
||||||
|
case value_t::discarded:
|
||||||
default:
|
default:
|
||||||
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
|
JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
|
||||||
return;
|
return;
|
||||||
@@ -22728,8 +22710,6 @@ class binary_writer
|
|||||||
byte, before anything is written
|
byte, before anything is written
|
||||||
@throw type_error.316 if a string value or a key is not valid UTF-8,
|
@throw type_error.316 if a string value or a key is not valid UTF-8,
|
||||||
before anything is written
|
before anything is written
|
||||||
@throw type_error.321 if a value nested in @a document is discarded,
|
|
||||||
before anything is written
|
|
||||||
*/
|
*/
|
||||||
std::size_t calc_bson_sizes(const BasicJsonType& document, std::vector<std::size_t>& nested_sizes)
|
std::size_t calc_bson_sizes(const BasicJsonType& document, std::vector<std::size_t>& nested_sizes)
|
||||||
{
|
{
|
||||||
@@ -27368,6 +27348,70 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
/// SAX interface type, see @ref nlohmann::json_sax
|
/// SAX interface type, see @ref nlohmann::json_sax
|
||||||
using json_sax_t = json_sax<basic_json>;
|
using json_sax_t = json_sax<basic_json>;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// utility templates to create a json type with different template parameters //
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/// Json type using a different type for storing objects
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<template<typename, typename, typename...> class ObjectType2>
|
||||||
|
using with_object_t = basic_json<ObjectType2, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing arrays
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<template<typename, typename...> class ArrayType2>
|
||||||
|
using with_array_t = basic_json<ObjectType, ArrayType2, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing strings
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class StringType2>
|
||||||
|
using with_string_t = basic_json<ObjectType, ArrayType, StringType2, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing booleans
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class BooleanType2>
|
||||||
|
using with_boolean_t = basic_json<ObjectType, ArrayType, StringType, BooleanType2,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using different types for storing signed and unsigned integers
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class NumberIntegerType2, class NumberUnsignedType2>
|
||||||
|
using with_integers_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType2, NumberUnsignedType2, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing floating point numbers
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class NumberFloatType2>
|
||||||
|
using with_float_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType2, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type as base allocator
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<template<typename> class AllocatorType2>
|
||||||
|
using with_allocator_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType2, JSONSerializer, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type as json serializer
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<template<typename, typename = void> class JSONSerializer2>
|
||||||
|
using with_json_serializer_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer2, BinaryType, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type for storing binary data
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class BinaryType2>
|
||||||
|
using with_binary_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType2, CustomBaseClass>;
|
||||||
|
|
||||||
|
/// Json type using a different type as base class
|
||||||
|
/// @sa https://json.nlohmann.me/api/basic_json/with_t/
|
||||||
|
template<class CustomBaseClass2>
|
||||||
|
using with_base_class_t = basic_json<ObjectType, ArrayType, StringType, BooleanType,
|
||||||
|
NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass2>;
|
||||||
|
|
||||||
////////////////
|
////////////////
|
||||||
// exceptions //
|
// exceptions //
|
||||||
////////////////
|
////////////////
|
||||||
|
|||||||
@@ -48,14 +48,7 @@ TEST_CASE("bad_alloc")
|
|||||||
SECTION("bad_alloc")
|
SECTION("bad_alloc")
|
||||||
{
|
{
|
||||||
// create JSON type using the throwing allocator
|
// create JSON type using the throwing allocator
|
||||||
using bad_json = nlohmann::basic_json<std::map,
|
using bad_json = nlohmann::json::with_allocator_t<bad_allocator>;
|
||||||
std::vector,
|
|
||||||
std::string,
|
|
||||||
bool,
|
|
||||||
std::int64_t,
|
|
||||||
std::uint64_t,
|
|
||||||
double,
|
|
||||||
bad_allocator>;
|
|
||||||
|
|
||||||
// creating an object should throw
|
// creating an object should throw
|
||||||
CHECK_THROWS_AS(bad_json(bad_json::value_t::object), std::bad_alloc&);
|
CHECK_THROWS_AS(bad_json(bad_json::value_t::object), std::bad_alloc&);
|
||||||
@@ -129,14 +122,7 @@ void my_allocator_clean_up(T* p)
|
|||||||
TEST_CASE("controlled bad_alloc")
|
TEST_CASE("controlled bad_alloc")
|
||||||
{
|
{
|
||||||
// create JSON type using the throwing allocator
|
// create JSON type using the throwing allocator
|
||||||
using my_json = nlohmann::basic_json<std::map,
|
using my_json = nlohmann::json::with_allocator_t<my_allocator>;
|
||||||
std::vector,
|
|
||||||
std::string,
|
|
||||||
bool,
|
|
||||||
std::int64_t,
|
|
||||||
std::uint64_t,
|
|
||||||
double,
|
|
||||||
my_allocator>;
|
|
||||||
|
|
||||||
SECTION("class json_value")
|
SECTION("class json_value")
|
||||||
{
|
{
|
||||||
@@ -588,14 +574,7 @@ TEST_CASE("bad my_allocator::construct")
|
|||||||
{
|
{
|
||||||
SECTION("my_allocator::construct doesn't forward")
|
SECTION("my_allocator::construct doesn't forward")
|
||||||
{
|
{
|
||||||
using bad_alloc_json = nlohmann::basic_json<std::map,
|
using bad_alloc_json = nlohmann::json::with_allocator_t<allocator_no_forward>;
|
||||||
std::vector,
|
|
||||||
std::string,
|
|
||||||
bool,
|
|
||||||
std::int64_t,
|
|
||||||
std::uint64_t,
|
|
||||||
double,
|
|
||||||
allocator_no_forward>;
|
|
||||||
|
|
||||||
bad_alloc_json j;
|
bad_alloc_json j;
|
||||||
j["test"] = bad_alloc_json::array_t();
|
j["test"] = bad_alloc_json::array_t();
|
||||||
|
|||||||
@@ -163,16 +163,7 @@ void int_to_string(alt_string& target, std::size_t value)
|
|||||||
target = std::to_string(value).c_str();
|
target = std::to_string(value).c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
using alt_json = nlohmann::basic_json <
|
using alt_json = nlohmann::json::with_string_t<alt_string>;
|
||||||
std::map,
|
|
||||||
std::vector,
|
|
||||||
alt_string,
|
|
||||||
bool,
|
|
||||||
std::int64_t,
|
|
||||||
std::uint64_t,
|
|
||||||
double,
|
|
||||||
std::allocator,
|
|
||||||
nlohmann::adl_serializer >;
|
|
||||||
|
|
||||||
bool operator<(const char* op1, const alt_string& op2) noexcept
|
bool operator<(const char* op1, const alt_string& op2) noexcept
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -106,59 +106,10 @@ TEST_CASE("BJData")
|
|||||||
{
|
{
|
||||||
SECTION("discarded")
|
SECTION("discarded")
|
||||||
{
|
{
|
||||||
// a discarded value cannot be serialized to BJData
|
// discarded values are not serialized
|
||||||
json const j = json::value_t::discarded;
|
json const j = json::value_t::discarded;
|
||||||
CHECK_THROWS_WITH_AS(json::to_bjdata(j), "[json.exception.type_error.321] cannot serialize discarded value to BJData", json::type_error&);
|
const auto result = json::to_bjdata(j);
|
||||||
}
|
CHECK(result.empty());
|
||||||
|
|
||||||
SECTION("discarded values nested in a container")
|
|
||||||
{
|
|
||||||
json const discarded = json::value_t::discarded;
|
|
||||||
|
|
||||||
SECTION("in an array")
|
|
||||||
{
|
|
||||||
json const j = {1, discarded, 2};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bjdata(j), "[json.exception.type_error.321] (/1) cannot serialize discarded value to BJData", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bjdata(j), "[json.exception.type_error.321] cannot serialize discarded value to BJData", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("as an object value")
|
|
||||||
{
|
|
||||||
json j;
|
|
||||||
j["a"] = 1;
|
|
||||||
j["b"] = discarded;
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bjdata(j), "[json.exception.type_error.321] (/b) cannot serialize discarded value to BJData", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bjdata(j), "[json.exception.type_error.321] cannot serialize discarded value to BJData", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("nested deeper (array in object in array)")
|
|
||||||
{
|
|
||||||
json inner_array = {1, discarded};
|
|
||||||
json middle_object;
|
|
||||||
middle_object["x"] = inner_array;
|
|
||||||
json const j = {middle_object};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bjdata(j), "[json.exception.type_error.321] (/0/x/1) cannot serialize discarded value to BJData", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bjdata(j), "[json.exception.type_error.321] cannot serialize discarded value to BJData", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("optimized array of all-discarded elements")
|
|
||||||
{
|
|
||||||
json const j = {discarded, discarded};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bjdata(j, true, true), "[json.exception.type_error.321] (/0) cannot serialize discarded value to BJData", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bjdata(j, true, true), "[json.exception.type_error.321] cannot serialize discarded value to BJData", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
|
|||||||
@@ -141,54 +141,6 @@ TEST_CASE("BSON")
|
|||||||
json const j = std::vector<int> {1, 2, 3, 4, 5, 6, 7};
|
json const j = std::vector<int> {1, 2, 3, 4, 5, 6, 7};
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is array", json::type_error&);
|
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is array", json::type_error&);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("discarded")
|
|
||||||
{
|
|
||||||
json const j = json::value_t::discarded;
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.317] to serialize to BSON, top-level type must be object, but is discarded", json::type_error&);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("discarded values nested in a container cannot be serialized to BSON")
|
|
||||||
{
|
|
||||||
json const discarded = json::value_t::discarded;
|
|
||||||
|
|
||||||
SECTION("as an object value")
|
|
||||||
{
|
|
||||||
json j;
|
|
||||||
j["a"] = 1;
|
|
||||||
j["b"] = discarded;
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.321] (/b) cannot serialize discarded value to BSON", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.321] cannot serialize discarded value to BSON", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("in an array that is an object value")
|
|
||||||
{
|
|
||||||
json j;
|
|
||||||
j["a"] = json::array({1, discarded, 2});
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.321] (/a/1) cannot serialize discarded value to BSON", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.321] cannot serialize discarded value to BSON", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("nested deeper (array in object in object)")
|
|
||||||
{
|
|
||||||
json inner_array = {1, discarded};
|
|
||||||
json middle_object;
|
|
||||||
middle_object["x"] = inner_array;
|
|
||||||
json j;
|
|
||||||
j["outer"] = middle_object;
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.321] (/outer/x/1) cannot serialize discarded value to BSON", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_bson(j), "[json.exception.type_error.321] cannot serialize discarded value to BSON", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("keys containing code-point U+0000 cannot be serialized to BSON")
|
SECTION("keys containing code-point U+0000 cannot be serialized to BSON")
|
||||||
|
|||||||
+3
-42
@@ -30,49 +30,10 @@ TEST_CASE("CBOR")
|
|||||||
{
|
{
|
||||||
SECTION("discarded")
|
SECTION("discarded")
|
||||||
{
|
{
|
||||||
// a discarded value cannot be serialized to CBOR
|
// discarded values are not serialized
|
||||||
json const j = json::value_t::discarded;
|
json const j = json::value_t::discarded;
|
||||||
CHECK_THROWS_WITH_AS(json::to_cbor(j), "[json.exception.type_error.321] cannot serialize discarded value to CBOR", json::type_error&);
|
const auto result = json::to_cbor(j);
|
||||||
}
|
CHECK(result.empty());
|
||||||
|
|
||||||
SECTION("discarded values nested in a container")
|
|
||||||
{
|
|
||||||
json const discarded = json::value_t::discarded;
|
|
||||||
|
|
||||||
SECTION("in an array")
|
|
||||||
{
|
|
||||||
json const j = {1, discarded, 2};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_cbor(j), "[json.exception.type_error.321] (/1) cannot serialize discarded value to CBOR", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_cbor(j), "[json.exception.type_error.321] cannot serialize discarded value to CBOR", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("as an object value")
|
|
||||||
{
|
|
||||||
json j;
|
|
||||||
j["a"] = 1;
|
|
||||||
j["b"] = discarded;
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_cbor(j), "[json.exception.type_error.321] (/b) cannot serialize discarded value to CBOR", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_cbor(j), "[json.exception.type_error.321] cannot serialize discarded value to CBOR", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("nested deeper (array in object in array)")
|
|
||||||
{
|
|
||||||
json inner_array = {1, discarded};
|
|
||||||
json middle_object;
|
|
||||||
middle_object["x"] = inner_array;
|
|
||||||
json const j = {middle_object};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_cbor(j), "[json.exception.type_error.321] (/0/x/1) cannot serialize discarded value to CBOR", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_cbor(j), "[json.exception.type_error.321] cannot serialize discarded value to CBOR", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("NaN")
|
SECTION("NaN")
|
||||||
|
|||||||
@@ -38,20 +38,7 @@ class json_metadata
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
using json_with_metadata =
|
using json_with_metadata = nlohmann::json::with_base_class_t<json_metadata<T>>;
|
||||||
nlohmann::basic_json <
|
|
||||||
std::map,
|
|
||||||
std::vector,
|
|
||||||
std::string,
|
|
||||||
bool,
|
|
||||||
std::int64_t,
|
|
||||||
std::uint64_t,
|
|
||||||
double,
|
|
||||||
std::allocator,
|
|
||||||
nlohmann::adl_serializer,
|
|
||||||
std::vector<std::uint8_t>,
|
|
||||||
json_metadata<T>
|
|
||||||
>;
|
|
||||||
|
|
||||||
TEST_CASE("JSON Node Metadata")
|
TEST_CASE("JSON Node Metadata")
|
||||||
{
|
{
|
||||||
@@ -268,19 +255,7 @@ class visitor_adaptor
|
|||||||
void do_visit(const Ptr& ptr, const Fnc& fnc) const;
|
void do_visit(const Ptr& ptr, const Fnc& fnc) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
using json_with_visitor_t = nlohmann::basic_json <
|
using json_with_visitor_t = nlohmann::json::with_base_class_t<visitor_adaptor>;
|
||||||
std::map,
|
|
||||||
std::vector,
|
|
||||||
std::string,
|
|
||||||
bool,
|
|
||||||
std::int64_t,
|
|
||||||
std::uint64_t,
|
|
||||||
double,
|
|
||||||
std::allocator,
|
|
||||||
nlohmann::adl_serializer,
|
|
||||||
std::vector<std::uint8_t>,
|
|
||||||
visitor_adaptor
|
|
||||||
>;
|
|
||||||
|
|
||||||
template <class Fnc>
|
template <class Fnc>
|
||||||
void visitor_adaptor::visit(const Fnc& fnc) const
|
void visitor_adaptor::visit(const Fnc& fnc) const
|
||||||
|
|||||||
@@ -33,49 +33,10 @@ TEST_CASE("MessagePack")
|
|||||||
{
|
{
|
||||||
SECTION("discarded")
|
SECTION("discarded")
|
||||||
{
|
{
|
||||||
// a discarded value cannot be serialized to MessagePack
|
// discarded values are not serialized
|
||||||
json const j = json::value_t::discarded;
|
json const j = json::value_t::discarded;
|
||||||
CHECK_THROWS_WITH_AS(json::to_msgpack(j), "[json.exception.type_error.321] cannot serialize discarded value to MessagePack", json::type_error&);
|
const auto result = json::to_msgpack(j);
|
||||||
}
|
CHECK(result.empty());
|
||||||
|
|
||||||
SECTION("discarded values nested in a container")
|
|
||||||
{
|
|
||||||
json const discarded = json::value_t::discarded;
|
|
||||||
|
|
||||||
SECTION("in an array")
|
|
||||||
{
|
|
||||||
json const j = {1, discarded, 2};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_msgpack(j), "[json.exception.type_error.321] (/1) cannot serialize discarded value to MessagePack", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_msgpack(j), "[json.exception.type_error.321] cannot serialize discarded value to MessagePack", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("as an object value")
|
|
||||||
{
|
|
||||||
json j;
|
|
||||||
j["a"] = 1;
|
|
||||||
j["b"] = discarded;
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_msgpack(j), "[json.exception.type_error.321] (/b) cannot serialize discarded value to MessagePack", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_msgpack(j), "[json.exception.type_error.321] cannot serialize discarded value to MessagePack", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("nested deeper (array in object in array)")
|
|
||||||
{
|
|
||||||
json inner_array = {1, discarded};
|
|
||||||
json middle_object;
|
|
||||||
middle_object["x"] = inner_array;
|
|
||||||
json const j = {middle_object};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_msgpack(j), "[json.exception.type_error.321] (/0/x/1) cannot serialize discarded value to MessagePack", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_msgpack(j), "[json.exception.type_error.321] cannot serialize discarded value to MessagePack", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
|
|||||||
@@ -27,59 +27,10 @@ TEST_CASE("UBJSON")
|
|||||||
{
|
{
|
||||||
SECTION("discarded")
|
SECTION("discarded")
|
||||||
{
|
{
|
||||||
// a discarded value cannot be serialized to UBJSON
|
// discarded values are not serialized
|
||||||
json const j = json::value_t::discarded;
|
json const j = json::value_t::discarded;
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j), "[json.exception.type_error.321] cannot serialize discarded value to UBJSON", json::type_error&);
|
const auto result = json::to_ubjson(j);
|
||||||
}
|
CHECK(result.empty());
|
||||||
|
|
||||||
SECTION("discarded values nested in a container")
|
|
||||||
{
|
|
||||||
json const discarded = json::value_t::discarded;
|
|
||||||
|
|
||||||
SECTION("in an array")
|
|
||||||
{
|
|
||||||
json const j = {1, discarded, 2};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j), "[json.exception.type_error.321] (/1) cannot serialize discarded value to UBJSON", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j), "[json.exception.type_error.321] cannot serialize discarded value to UBJSON", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("as an object value")
|
|
||||||
{
|
|
||||||
json j;
|
|
||||||
j["a"] = 1;
|
|
||||||
j["b"] = discarded;
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j), "[json.exception.type_error.321] (/b) cannot serialize discarded value to UBJSON", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j), "[json.exception.type_error.321] cannot serialize discarded value to UBJSON", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("nested deeper (array in object in array)")
|
|
||||||
{
|
|
||||||
json inner_array = {1, discarded};
|
|
||||||
json middle_object;
|
|
||||||
middle_object["x"] = inner_array;
|
|
||||||
json const j = {middle_object};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j), "[json.exception.type_error.321] (/0/x/1) cannot serialize discarded value to UBJSON", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j), "[json.exception.type_error.321] cannot serialize discarded value to UBJSON", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SECTION("optimized array of all-discarded elements")
|
|
||||||
{
|
|
||||||
json const j = {discarded, discarded};
|
|
||||||
#if JSON_DIAGNOSTICS
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j, true, true), "[json.exception.type_error.321] (/0) cannot serialize discarded value to UBJSON", json::type_error&);
|
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j, true, true), "[json.exception.type_error.321] cannot serialize discarded value to UBJSON", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
@@ -2140,14 +2091,9 @@ TEST_CASE("UBJSON")
|
|||||||
|
|
||||||
SECTION("discarded")
|
SECTION("discarded")
|
||||||
{
|
{
|
||||||
// a discarded value cannot be serialized to UBJSON, even as part
|
|
||||||
// of an optimized array of a single (here: valueless) type
|
|
||||||
json const j = {json::value_t::discarded, json::value_t::discarded};
|
json const j = {json::value_t::discarded, json::value_t::discarded};
|
||||||
#if JSON_DIAGNOSTICS
|
std::vector<uint8_t> expected = {'[', '$', 'N', '#', 'i', 2};
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j, true, true), "[json.exception.type_error.321] (/0) cannot serialize discarded value to UBJSON", json::type_error&);
|
CHECK(json::to_ubjson(j, true, true) == expected);
|
||||||
#else
|
|
||||||
CHECK_THROWS_WITH_AS(json::to_ubjson(j, true, true), "[json.exception.type_error.321] cannot serialize discarded value to UBJSON", json::type_error&);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+77
-3
@@ -23,6 +23,7 @@ using nlohmann::json;
|
|||||||
using namespace nlohmann::literals; // NOLINT(google-build-using-namespace)
|
using namespace nlohmann::literals; // NOLINT(google-build-using-namespace)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <deque>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -684,8 +685,7 @@ static std::ostream& operator<<(std::ostream& os, small_pod l)
|
|||||||
TEST_CASE("custom serializer for pods" * doctest::test_suite("udt"))
|
TEST_CASE("custom serializer for pods" * doctest::test_suite("udt"))
|
||||||
{
|
{
|
||||||
using custom_json =
|
using custom_json =
|
||||||
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
nlohmann::json::with_json_serializer_t<pod_serializer>;
|
||||||
std::int64_t, std::uint64_t, double, std::allocator, pod_serializer>;
|
|
||||||
|
|
||||||
auto p = udt::small_pod{42, '/', 42};
|
auto p = udt::small_pod{42, '/', 42};
|
||||||
custom_json const j = p;
|
custom_json const j = p;
|
||||||
@@ -703,7 +703,7 @@ TEST_CASE("custom serializer for pods" * doctest::test_suite("udt"))
|
|||||||
template <typename T, typename>
|
template <typename T, typename>
|
||||||
struct another_adl_serializer;
|
struct another_adl_serializer;
|
||||||
|
|
||||||
using custom_json = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, double, std::allocator, another_adl_serializer>;
|
using custom_json = nlohmann::json::with_json_serializer_t<another_adl_serializer>;
|
||||||
|
|
||||||
template <typename T, typename>
|
template <typename T, typename>
|
||||||
struct another_adl_serializer
|
struct another_adl_serializer
|
||||||
@@ -734,6 +734,80 @@ TEST_CASE("custom serializer that does adl by default" * doctest::test_suite("ud
|
|||||||
CHECK(me == cj.get<udt::person>());
|
CHECK(me == cj.get<udt::person>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("with_*_t aliases" * doctest::test_suite("udt"))
|
||||||
|
{
|
||||||
|
// a custom base class used to check with_base_class_t
|
||||||
|
struct custom_base_class {};
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_object_t<std::deque>,
|
||||||
|
nlohmann::basic_json<std::deque, std::vector, std::string, bool,
|
||||||
|
std::int64_t, std::uint64_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_array_t<std::deque>,
|
||||||
|
nlohmann::basic_json<std::map, std::deque, std::string, bool,
|
||||||
|
std::int64_t, std::uint64_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_string_t<std::wstring>,
|
||||||
|
nlohmann::basic_json<std::map, std::vector, std::wstring, bool,
|
||||||
|
std::int64_t, std::uint64_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_boolean_t<int>,
|
||||||
|
nlohmann::basic_json<std::map, std::vector, std::string, int,
|
||||||
|
std::int64_t, std::uint64_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_integers_t<std::int32_t, std::uint32_t>,
|
||||||
|
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||||
|
std::int32_t, std::uint32_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_float_t<float>,
|
||||||
|
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||||
|
std::int64_t, std::uint64_t, float, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_allocator_t<std::allocator>,
|
||||||
|
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||||
|
std::int64_t, std::uint64_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_json_serializer_t<nlohmann::adl_serializer>,
|
||||||
|
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||||
|
std::int64_t, std::uint64_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_binary_t<std::vector<char>>,
|
||||||
|
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||||
|
std::int64_t, std::uint64_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<char>>>::value);
|
||||||
|
|
||||||
|
CHECK(std::is_same<json::with_base_class_t<custom_base_class>,
|
||||||
|
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||||
|
std::int64_t, std::uint64_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>, custom_base_class>>::value);
|
||||||
|
|
||||||
|
// with_string_t on ordered_json must keep ordered_map as the object type
|
||||||
|
CHECK(std::is_same<nlohmann::ordered_json::with_string_t<std::wstring>,
|
||||||
|
nlohmann::basic_json<nlohmann::ordered_map, std::vector, std::wstring, bool,
|
||||||
|
std::int64_t, std::uint64_t, double, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
|
||||||
|
// the aliases are members of the resulting type, so they can be chained
|
||||||
|
CHECK(std::is_same<json::with_integers_t<int, unsigned int>::with_float_t<float>,
|
||||||
|
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||||
|
int, unsigned int, float, std::allocator,
|
||||||
|
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||||
|
CHECK(std::is_same<json::with_float_t<float>::with_integers_t<int, unsigned int>,
|
||||||
|
json::with_integers_t<int, unsigned int>::with_float_t<float>>::value);
|
||||||
|
|
||||||
|
// replacing the object type of json with ordered_map yields ordered_json
|
||||||
|
CHECK(std::is_same<json::with_object_t<nlohmann::ordered_map>, nlohmann::ordered_json>::value);
|
||||||
|
CHECK(std::is_same<nlohmann::ordered_json::with_object_t<std::map>, json>::value);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("different basic_json types conversions")
|
TEST_CASE("different basic_json types conversions")
|
||||||
{
|
{
|
||||||
SECTION("null")
|
SECTION("null")
|
||||||
|
|||||||
Reference in New Issue
Block a user