-
-
Notifications
You must be signed in to change notification settings - Fork 6.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add strict enum de/serialization macro
Signed-off-by: Harinath Nampally <harinath922@gmail.com>
- Loading branch information
Showing
8 changed files
with
395 additions
and
1 deletion.
There are no files selected for viewing
90 changes: 90 additions & 0 deletions
90
docs/mkdocs/docs/api/macros/nlohmann_json_serialize_enum _strict.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
# NLOHMANN_JSON_SERIALIZE_ENUM_STRICT | ||
|
||
```cpp | ||
#define NLOHMANN_JSON_SERIALIZE_ENUM_STRICT(type, conversion...) | ||
``` | ||
|
||
The `NLOHMANN_JSON_SERIALIZE_ENUM_STRICT` allows to define a user-defined serialization for every enumerator. | ||
|
||
This macro declares strict serialization and deserialization functions (`to_json` and `from_json`) for an enum type. Unlike [`NLOHMANN_JSON_SERIALIZE_ENUM`](nlohmann_json_serialize_enum.md), this macro enforces strict validation and throws errors for unmapped values instead of defaulting to the first enum value. | ||
|
||
|
||
## Parameters | ||
|
||
`type` (in) | ||
: name of the enum to serialize/deserialize | ||
|
||
`conversion` (in) | ||
: a pair of an enumerator and a JSON serialization; arbitrary pairs can be given as a comma-separated list | ||
|
||
## Default definition | ||
|
||
The macro adds two functions to the namespace which take care of the serialization and deserialization: | ||
|
||
```cpp | ||
template<typename BasicJsonType> | ||
inline void to_json(BasicJsonType& j, const type& e); | ||
template<typename BasicJsonType> | ||
inline void from_json(const BasicJsonType& j, type& e); | ||
``` | ||
## Notes | ||
!!! info "Prerequisites" | ||
The macro must be used inside the namespace of the enum. | ||
!!! important "Important notes" | ||
- If an enum value appears more than once in the mapping, only the first occurrence will be used for serialization, subsequent mappings for the same enum value will be ignored. | ||
- If a JSON value appears more than once in the mapping, only the first occurrence will be used for deserialization, subsequent mappings for the same JSON value will be ignored. | ||
- Unlike `NLOHMANN_JSON_SERIALIZE_ENUM`, this macro enforces strict validation: | ||
- Attempting to serialize an unmapped enum value will throw a `type_error.302` exception | ||
- Attempting to deserialize an unmapped JSON value will throw a `type_error.302` exception | ||
- There is no default value behavior - all values must be explicitly mapped | ||
## Examples | ||
??? example "Example 1: Strict serialization" | ||
The example shows how `NLOHMANN_JSON_SERIALIZE_ENUM_STRICT` enforces strict validation when serializing an enum value that is not in the mapping: | ||
```cpp | ||
--8<-- "examples/nlohmann_json_serialize_enum_strict.cpp" | ||
``` | ||
Expected output: | ||
``` | ||
[json.exception.type_error.302] can't serialize - enum value 3 out of range | ||
``` | ||
??? example "Example 2: Strict deserialization" | ||
The example shows how `NLOHMANN_JSON_SERIALIZE_ENUM_STRICT` enforces strict validation when deserializing a JSON value that is not in the mapping: | ||
```cpp | ||
--8<-- "examples/nlohmann_json_deserialize_enum_strict.cpp" | ||
``` | ||
Expected output: | ||
``` | ||
[json.exception.type_error.302] can't deserialize - invalid json value : "yellow" | ||
``` | ||
Both examples demonstrate: | ||
- Proper error handling using try-catch blocks | ||
- Clear error messages indicating the cause of failure | ||
- No default value behavior - all values must be explicitly mapped | ||
- Exception throwing for unmapped values | ||
## See also | ||
- [Specializing enum conversion](../../features/enum_conversion.md) | ||
- [`JSON_DISABLE_ENUM_SERIALIZATION`](json_disable_enum_serialization.md) | ||
## Version history | ||
- Added in version 3.11.3. |
57 changes: 57 additions & 0 deletions
57
docs/mkdocs/docs/examples/nlohmann_json_deserialize_enum_strict.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
#include <iostream> | ||
#include <nlohmann/json.hpp> | ||
|
||
#ifdef __cpp_exceptions | ||
#undef __cpp_exceptions | ||
#define __cpp_exceptions 1 | ||
#endif | ||
|
||
#ifdef JSON_NOEXCEPTION | ||
#define JSON_NOEXCEPTION 0 | ||
#endif | ||
|
||
#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) | ||
#define JSON_THROW(exception) throw exception | ||
#define JSON_TRY try | ||
#define JSON_CATCH(exception) catch(exception) | ||
#define JSON_INTERNAL_CATCH(exception) catch(exception) | ||
#else | ||
#include <cstdlib> | ||
#define JSON_THROW(exception) std::abort() | ||
#define JSON_TRY if(true) | ||
#define JSON_CATCH(exception) if(false) | ||
#define JSON_INTERNAL_CATCH(exception) if(false) | ||
#endif | ||
|
||
using json = nlohmann::json; | ||
|
||
namespace ns | ||
{ | ||
enum class Color | ||
{ | ||
red, green, blue | ||
}; | ||
|
||
NLOHMANN_JSON_SERIALIZE_ENUM_STRICT(Color, | ||
{ | ||
{ Color::red, "red" }, | ||
{ Color::green, "green" }, | ||
{ Color::blue, "blue" }, | ||
}) | ||
} | ||
|
||
int main() | ||
{ | ||
|
||
// deserialization | ||
json j_yellow = "yellow"; | ||
try | ||
{ | ||
auto yellow = j_yellow.template get<ns::Color>(); | ||
std::cout << j_yellow << " -> " << static_cast<int>(yellow) << std::endl; | ||
} | ||
catch (const nlohmann::json::exception& e) | ||
{ | ||
std::cout << e.what() << std::endl; | ||
} | ||
} |
56 changes: 56 additions & 0 deletions
56
docs/mkdocs/docs/examples/nlohmann_json_serialize_enum_strict.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
#include <iostream> | ||
#include <nlohmann/json.hpp> | ||
|
||
#ifdef __cpp_exceptions | ||
#undef __cpp_exceptions | ||
#define __cpp_exceptions 1 | ||
#endif | ||
|
||
#ifdef JSON_NOEXCEPTION | ||
#define JSON_NOEXCEPTION 0 | ||
#endif | ||
|
||
#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) | ||
#define JSON_THROW(exception) throw exception | ||
#define JSON_TRY try | ||
#define JSON_CATCH(exception) catch(exception) | ||
#define JSON_INTERNAL_CATCH(exception) catch(exception) | ||
#else | ||
#include <cstdlib> | ||
#define JSON_THROW(exception) std::abort() | ||
#define JSON_TRY if(true) | ||
#define JSON_CATCH(exception) if(false) | ||
#define JSON_INTERNAL_CATCH(exception) if(false) | ||
#endif | ||
|
||
using json = nlohmann::json; | ||
|
||
namespace ns | ||
{ | ||
enum class Color | ||
{ | ||
red, green, blue, pink | ||
}; | ||
|
||
NLOHMANN_JSON_SERIALIZE_ENUM_STRICT(Color, | ||
{ | ||
{ Color::red, "red" }, | ||
{ Color::green, "green" }, | ||
{ Color::blue, "blue" }, | ||
}) | ||
} | ||
|
||
int main() | ||
{ | ||
// serialization | ||
try | ||
{ | ||
json j_red = ns::Color::pink; | ||
auto color = j_red.get<ns::Color>(); | ||
std::cout << static_cast<int>(color) << " -> " << j_red << std::endl; | ||
} | ||
catch (const nlohmann::json::exception& e) | ||
{ | ||
std::cout << e.what() << std::endl; | ||
} | ||
} |
1 change: 1 addition & 0 deletions
1
docs/mkdocs/docs/examples/nlohmann_json_serialize_enum_strict.output
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[json.exception.type_error.302] can't serialize - enum value 3 out of range |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.