|
#define | FMT_HEADER_ONLY |
|
#define | __FOR_JSON_COUNT_NN(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, N, ...) _FOR_JSON_##N |
|
#define | _FOR_JSON_COUNT_NN_WITH_0(...) |
|
#define | _FOR_JSON_COUNT_NN(...) _FOR_JSON_COUNT_NN_WITH_0(DUMMY, ##__VA_ARGS__) |
|
#define | _FOR_JSON_0(POP_N) _FOR_JSON_0_##POP_N |
|
#define | _FOR_JSON_1(POP_N) _FOR_JSON_1_##POP_N |
|
#define | _FOR_JSON_2(POP_N) _FOR_JSON_2_##POP_N |
|
#define | _FOR_JSON_3(POP_N) _FOR_JSON_3_##POP_N |
|
#define | _FOR_JSON_4(POP_N) _FOR_JSON_4_##POP_N |
|
#define | _FOR_JSON_5(POP_N) _FOR_JSON_5_##POP_N |
|
#define | _FOR_JSON_6(POP_N) _FOR_JSON_6_##POP_N |
|
#define | _FOR_JSON_7(POP_N) _FOR_JSON_7_##POP_N |
|
#define | _FOR_JSON_8(POP_N) _FOR_JSON_8_##POP_N |
|
#define | _FOR_JSON_9(POP_N) _FOR_JSON_9_##POP_N |
|
#define | _FOR_JSON_10(POP_N) _FOR_JSON_10_##POP_N |
|
#define | _FOR_JSON_11(POP_N) _FOR_JSON_11_##POP_N |
|
#define | _FOR_JSON_12(POP_N) _FOR_JSON_12_##POP_N |
|
#define | _FOR_JSON_13(POP_N) _FOR_JSON_13_##POP_N |
|
#define | _FOR_JSON_14(POP_N) _FOR_JSON_14_##POP_N |
|
#define | _FOR_JSON_15(POP_N) _FOR_JSON_15_##POP_N |
|
#define | _FOR_JSON_16(POP_N) _FOR_JSON_16_##POP_N |
|
#define | _FOR_JSON_17(POP_N) _FOR_JSON_17_##POP_N |
|
#define | _FOR_JSON_18(POP_N) _FOR_JSON_18_##POP_N |
|
#define | _FOR_JSON_19(POP_N) _FOR_JSON_19_##POP_N |
|
#define | _FOR_JSON_20(POP_N) _FOR_JSON_20_##POP_N |
|
#define | _FOR_JSON_21(POP_N) _FOR_JSON_21_##POP_N |
|
#define | _FOR_JSON_22(POP_N) _FOR_JSON_22_##POP_N |
|
#define | _FOR_JSON_23(POP_N) _FOR_JSON_23_##POP_N |
|
#define | _FOR_JSON_24(POP_N) _FOR_JSON_24_##POP_N |
|
#define | _FOR_JSON_25(POP_N) _FOR_JSON_25_##POP_N |
|
#define | _FOR_JSON_26(POP_N) _FOR_JSON_26_##POP_N |
|
#define | _FOR_JSON_27(POP_N) _FOR_JSON_27_##POP_N |
|
#define | _FOR_JSON_28(POP_N) _FOR_JSON_28_##POP_N |
|
#define | _FOR_JSON_29(POP_N) _FOR_JSON_29_##POP_N |
|
#define | _FOR_JSON_30(POP_N) _FOR_JSON_30_##POP_N |
|
#define | _FOR_JSON_0_POP1(FUNC, TYPE) |
|
#define | _FOR_JSON_1_POP1(FUNC, TYPE, ARG1) _FOR_JSON_FINAL(FUNC, TYPE, ARG1) |
|
#define | _FOR_JSON_2_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_3_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_4_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_5_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_6_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_7_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_8_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_9_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_10_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_11_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_12_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_13_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_14_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_15_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_16_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_17_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_18_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_19_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_20_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_21_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_22_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_23_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_24_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_25_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_26_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_27_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_28_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_29_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_30_POP1(FUNC, TYPE, ARG1, ...) |
|
#define | _FOR_JSON_0_POP2(FUNC, TYPE) |
|
#define | _FOR_JSON_1_POP2(FUNC, TYPE, ARG1) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_2_POP2(FUNC, TYPE, ARG1, ARG2) _FOR_JSON_FINAL(FUNC, TYPE, ARG1, ARG2) |
|
#define | _FOR_JSON_3_POP2(FUNC, TYPE, ARG1, ARG2, ...) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_4_POP2(FUNC, TYPE, ARG1, ARG2, ...) |
|
#define | _FOR_JSON_5_POP2(FUNC, TYPE, ARG1, ARG2, ...) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_6_POP2(FUNC, TYPE, ARG1, ARG2, ...) |
|
#define | _FOR_JSON_7_POP2(FUNC, TYPE, ARG1, ARG2, ...) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_8_POP2(FUNC, TYPE, ARG1, ARG2, ...) |
|
#define | _FOR_JSON_9_POP2(FUNC, TYPE, ARG1, ARG2, ...) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_10_POP2(FUNC, TYPE, ARG1, ARG2, ...) |
|
#define | _FOR_JSON_11_POP2(FUNC, TYPE, ARG1, ARG2, ...) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_12_POP2(FUNC, TYPE, ARG1, ARG2, ...) |
|
#define | _FOR_JSON_13_POP2(FUNC, TYPE, ARG1, ARG2, ...) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_14_POP2(FUNC, TYPE, ARG1, ARG2, ...) |
|
#define | _FOR_JSON_15_POP2(FUNC, TYPE, ARG1, ARG2, ...) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_16_POP2(FUNC, TYPE, ARG1, ARG2, ...) |
|
#define | _FOR_JSON_17_POP2(FUNC, TYPE, ARG1, ARG2, ...) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_18_POP2(FUNC, TYPE, ARG1, ARG2, ...) |
|
#define | _FOR_JSON_19_POP2(FUNC, TYPE, ARG1, ARG2, ...) INVALID_ODD_ARGS |
|
#define | _FOR_JSON_20_POP2(FUNC, TYPE, ARG1, ARG2, ...) |
|
#define | _FOR_JSON_NEXT(FUNC, ...) FUNC##_FOR_JSON_NEXT(__VA_ARGS__) |
|
#define | _FOR_JSON_FINAL(FUNC, ...) FUNC##_FOR_JSON_FINAL(__VA_ARGS__) |
|
#define | WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD) WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | WRITE_REQUIRED_FOR_JSON_NEXT(TYPE, FIELD) WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD) |
|
#define | WRITE_REQUIRED_FOR_JSON_FINAL(TYPE, FIELD) WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD) |
|
#define | WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD) WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | WRITE_OPTIONAL_FOR_JSON_NEXT(TYPE, FIELD) WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD) |
|
#define | WRITE_OPTIONAL_FOR_JSON_FINAL(TYPE, FIELD) WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD) |
|
#define | READ_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | READ_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD) READ_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | READ_REQUIRED_FOR_JSON_NEXT(TYPE, FIELD) READ_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD) |
|
#define | READ_REQUIRED_FOR_JSON_FINAL(TYPE, FIELD) READ_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD) |
|
#define | READ_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | READ_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD) READ_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | READ_OPTIONAL_FOR_JSON_NEXT(TYPE, FIELD) READ_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD) |
|
#define | READ_OPTIONAL_FOR_JSON_FINAL(TYPE, FIELD) READ_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD) |
|
#define | FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD) FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | FILL_SCHEMA_REQUIRED_FOR_JSON_NEXT(TYPE, FIELD) FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD) |
|
#define | FILL_SCHEMA_REQUIRED_FOR_JSON_FINAL(TYPE, FIELD) FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD) |
|
#define | FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD) FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | FILL_SCHEMA_OPTIONAL_FOR_JSON_NEXT(TYPE, FIELD) FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD) |
|
#define | FILL_SCHEMA_OPTIONAL_FOR_JSON_FINAL(TYPE, FIELD) FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD) |
|
#define | ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD) |
|
#define | ADD_SCHEMA_COMPONENTS_REQUIRED_FOR_JSON_NEXT(TYPE, FIELD) ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD) |
|
#define | ADD_SCHEMA_COMPONENTS_REQUIRED_FOR_JSON_FINAL(TYPE, FIELD) |
|
#define | ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD) |
|
#define | ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD) |
|
#define | ADD_SCHEMA_COMPONENTS_OPTIONAL_FOR_JSON_NEXT(TYPE, FIELD) ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD) |
|
#define | ADD_SCHEMA_COMPONENTS_OPTIONAL_FOR_JSON_FINAL(TYPE, FIELD) |
|
#define | JSON_FIELD_FOR_JSON_NEXT(TYPE, FIELD) ccf::JsonField<decltype(TYPE::FIELD)>{#FIELD}, |
|
#define | JSON_FIELD_FOR_JSON_FINAL(TYPE, FIELD) |
|
#define | DECLARE_JSON_TYPE_IMPL(TYPE, PRE_TO_JSON, POST_TO_JSON, PRE_FROM_JSON, POST_FROM_JSON, PRE_FILL_SCHEMA, POST_FILL_SCHEMA, PRE_ADD_SCHEMA, POST_ADD_SCHEMA) |
|
#define | DECLARE_JSON_TYPE(TYPE) DECLARE_JSON_TYPE_IMPL(TYPE, , , , , , , , ) |
|
#define | DECLARE_JSON_TYPE_WITH_BASE(TYPE, BASE) |
|
#define | DECLARE_JSON_TYPE_WITH_2BASES(TYPE, BASE1, BASE2) |
|
#define | DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(TYPE) |
|
#define | DECLARE_JSON_TYPE_WITH_BASE_AND_OPTIONAL_FIELDS(TYPE, BASE) |
|
#define | DECLARE_JSON_REQUIRED_FIELDS(TYPE, ...) |
|
#define | DECLARE_JSON_REQUIRED_FIELDS_WITH_RENAMES(TYPE, ...) |
|
#define | DECLARE_JSON_OPTIONAL_FIELDS(TYPE, ...) |
|
#define | DECLARE_JSON_OPTIONAL_FIELDS_WITH_RENAMES(TYPE, ...) |
|
#define | DECLARE_JSON_ENUM(TYPE, ...) |
|
#define DECLARE_JSON_TYPE_IMPL |
( |
|
TYPE, |
|
|
|
PRE_TO_JSON, |
|
|
|
POST_TO_JSON, |
|
|
|
PRE_FROM_JSON, |
|
|
|
POST_FROM_JSON, |
|
|
|
PRE_FILL_SCHEMA, |
|
|
|
POST_FILL_SCHEMA, |
|
|
|
PRE_ADD_SCHEMA, |
|
|
|
POST_ADD_SCHEMA |
|
) |
| |
Defines from_json, to_json, fill_json_schema, schema_name and add_schema_components functions for struct/class types, converting member fields to JSON elements and populating schema documents describing this transformation. Missing elements will cause errors to be raised. This assumes that from_json, to_json, are implemented for each member field type, either manually or through these macros. Additionally, you will need schema_name, fill_json_schema, and add_schema_components to be defined for OpenAPI schema generation. // clang-format off ie, the following must compile, for each foo in T: T t; nlohmann::json j, schema; j["foo"] = t.foo; t.foo = j["foo"].get<decltype(T::foo)>(); fill_json_schema(schema, t); std::string s = schema_name(t.foo); // clang-format on
Optional fields will be inserted into the JSON object iff their value differs from the value in a default-constructed instance of T. So if optional fields are present, then T must be default-constructible and the optional fields must be distinguishable (have operator!= defined)
To use:
- Declare struct as normal
- Add DECLARE_JSON_TYPE, or WITH_BASE or WITH_OPTIONAL variants as required
- Add DECLARE_JSON_REQUIRED_FIELDS listing fields which must be present
- If there are optional fields, add DECLARE_JSON_OPTIONAL_FIELDS
- If the json and struct fields have different names, use WITH_RENAMES
Examples: struct X { int a, b; }; DECLARE_JSON_TYPE(X) DECLARE_JSON_REQUIRED_FIELDS(X, a, b)
Valid JSON: { "a": 42, "b": 100 } { "a": 42, "b": 100, "Unused": ["Anything"] } Invalid JSON: {} { "a": 42 } { "a": 42, "b": "Hello world" }
struct Y { bool c; std::string d; }; DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS(Y) DECLARE_JSON_REQUIRED_FIELDS(Y, c) DECLARE_JSON_OPTIONAL_FIELDS(Y, d)
Valid JSON: { "c": true } { "c": false, "d": "Hello" } Invalid JSON: { "d": "Hello" }
struct X_A : X { int m; }; DECLARE_JSON_TYPE_WITH_BASE(X_A, X) DECLARE_JSON_REQUIRED_FIELDS(X_A, m)
Valid JSON: { "a": 42, "b": 100, "m": 101 } Invalid JSON: { "a": 42, "b": 100 } { "m": 101 }
struct X_B : X { int n; }; DECLARE_JSON_TYPE_WITH_BASE_AND_OPTIONAL_FIELDS(X_B, X) DECLARE_JSON_REQUIRED_FIELDS(X_B) // NO additional required fields DECLARE_JSON_OPTIONAL_FIELDS(X_B, n)
Valid JSON: { "a": 42, "b": 100 } { "a": 42, "b": 100, "n": 101 } Invalid JSON: { "n": 101 }
struct Z { int snake_case; std::string s; }; DECLARE_JSON_TYPE(Z); DECLARE_JSON_REQUIRED_FIELDS_WITH_RENAMES(
Z, snake_case, camelCase, s, msg);
Valid JSON: { "camelCase": 42, "msg": "Hello" } (converts to and from struct {snake_case: 42, s: "Hello"})