61 lines
2.7 KiB
Markdown
61 lines
2.7 KiB
Markdown
# JSON Traits
|
|
|
|
Traits define the compatibility mapping for JWT-CPP required functionality to the JSON implementation of choice.
|
|
|
|
## Providing your own JSON Traits
|
|
|
|
There are several key items that need to be provided to a `jwt::basic_claim` in order for it to be interoperable with you JSON library of choice.
|
|
|
|
* type specifications
|
|
* conversion from generic "value type" to a specific type
|
|
* serialization and parsing
|
|
|
|
If ever you are not sure, the traits are heavily checked against static asserts to make sure you provide everything that's required.
|
|
|
|
> :warning: Not all JSON libraries are a like, you may need to extend certain types such that it can be used. See this [provided implementation](https://github.com/Thalhammer/jwt-cpp/blob/e6b92cca0b7088027269c481fa244e5c39df88ff/include/jwt-cpp/traits/danielaparker-jsoncons/traits.h#L18).
|
|
|
|
```cpp
|
|
struct my_favorite_json_library_traits {
|
|
// Type Specifications
|
|
using value_type = json; // The generic "value type" implementation, most libraries have one
|
|
using object_type = json::object_t; // The "map type" string to value
|
|
using array_type = json::array_t; // The "list type" array of values
|
|
using string_type = std::string; // The "list of chars", must be a narrow char
|
|
using number_type = double; // The "precision type"
|
|
using integer_type = int64_t; // The "integral type"
|
|
using boolean_type = bool; // The "boolean type"
|
|
|
|
// Translation between the implementation notion of type, to the jwt::json::type equivalent
|
|
static jwt::json::type get_type(const value_type &val) {
|
|
using jwt::json::type;
|
|
|
|
if (val.type() == json::value_t::object)
|
|
return type::object;
|
|
if (val.type() == json::value_t::array)
|
|
return type::array;
|
|
if (val.type() == json::value_t::string)
|
|
return type::string;
|
|
if (val.type() == json::value_t::number_float)
|
|
return type::number;
|
|
if (val.type() == json::value_t::number_integer)
|
|
return type::integer;
|
|
if (val.type() == json::value_t::boolean)
|
|
return type::boolean;
|
|
|
|
throw std::logic_error("invalid type");
|
|
}
|
|
|
|
// Conversion from generic value to specific type
|
|
static object_type as_object(const value_type &val);
|
|
static array_type as_array(const value_type &val);
|
|
static string_type as_string(const value_type &val);
|
|
static number_type as_number(const value_type &val);
|
|
static integer_type as_integer(const value_type &val);
|
|
static boolean_type as_boolean(const value_type &val);
|
|
|
|
// serialization and parsing
|
|
static bool parse(value_type &val, string_type str);
|
|
static string_type serialize(const value_type &val); // with no extra whitespace, padding or indentation
|
|
};
|
|
```
|