CCF
Loading...
Searching...
No Matches
Classes | Namespaces | Macros | Functions
json.h File Reference
#include "ccf/crypto/base64.h"
#include "ccf/ds/json_schema.h"
#include <cstdint>
#include <fmt/format.h>
#include <fmt/ranges.h>
#include <sstream>

Go to the source code of this file.

Classes

struct  ccf::JsonField< T >
 
class  ccf::JsonParseError
 

Namespaces

namespace  ccf
 
namespace  std
 STL namespace.
 

Macros

#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, ...)
 

Functions

template<typename T >
void std::to_json (nlohmann::json &j, const std::optional< T > &t)
 
template<typename T >
void std::from_json (const nlohmann::json &j, std::optional< T > &t)
 
template<typename T >
void std::to_json (nlohmann::json &j, const std::vector< T > &t)
 
template<typename T >
void std::from_json (const nlohmann::json &j, std::vector< T > &t)
 

Macro Definition Documentation

◆ __FOR_JSON_COUNT_NN

#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

◆ _FOR_JSON_0

#define _FOR_JSON_0 (   POP_N)    _FOR_JSON_0_##POP_N

◆ _FOR_JSON_0_POP1

#define _FOR_JSON_0_POP1 (   FUNC,
  TYPE 
)

◆ _FOR_JSON_0_POP2

#define _FOR_JSON_0_POP2 (   FUNC,
  TYPE 
)

◆ _FOR_JSON_1

#define _FOR_JSON_1 (   POP_N)    _FOR_JSON_1_##POP_N

◆ _FOR_JSON_10

#define _FOR_JSON_10 (   POP_N)    _FOR_JSON_10_##POP_N

◆ _FOR_JSON_10_POP1

#define _FOR_JSON_10_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_9_POP1(FUNC, TYPE, ##__VA_ARGS__)
#define _FOR_JSON_NEXT(FUNC,...)
Definition json.h:371

◆ _FOR_JSON_10_POP2

#define _FOR_JSON_10_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1, ARG2) \
_FOR_JSON_8_POP2(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_11

#define _FOR_JSON_11 (   POP_N)    _FOR_JSON_11_##POP_N

◆ _FOR_JSON_11_POP1

#define _FOR_JSON_11_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_10_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_11_POP2

#define _FOR_JSON_11_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_12

#define _FOR_JSON_12 (   POP_N)    _FOR_JSON_12_##POP_N

◆ _FOR_JSON_12_POP1

#define _FOR_JSON_12_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_11_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_12_POP2

#define _FOR_JSON_12_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1, ARG2) \
_FOR_JSON_10_POP2(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_13

#define _FOR_JSON_13 (   POP_N)    _FOR_JSON_13_##POP_N

◆ _FOR_JSON_13_POP1

#define _FOR_JSON_13_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_12_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_13_POP2

#define _FOR_JSON_13_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_14

#define _FOR_JSON_14 (   POP_N)    _FOR_JSON_14_##POP_N

◆ _FOR_JSON_14_POP1

#define _FOR_JSON_14_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_13_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_14_POP2

#define _FOR_JSON_14_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1, ARG2) \
_FOR_JSON_12_POP2(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_15

#define _FOR_JSON_15 (   POP_N)    _FOR_JSON_15_##POP_N

◆ _FOR_JSON_15_POP1

#define _FOR_JSON_15_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_14_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_15_POP2

#define _FOR_JSON_15_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_16

#define _FOR_JSON_16 (   POP_N)    _FOR_JSON_16_##POP_N

◆ _FOR_JSON_16_POP1

#define _FOR_JSON_16_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_15_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_16_POP2

#define _FOR_JSON_16_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1, ARG2) \
_FOR_JSON_14_POP2(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_17

#define _FOR_JSON_17 (   POP_N)    _FOR_JSON_17_##POP_N

◆ _FOR_JSON_17_POP1

#define _FOR_JSON_17_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_16_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_17_POP2

#define _FOR_JSON_17_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_18

#define _FOR_JSON_18 (   POP_N)    _FOR_JSON_18_##POP_N

◆ _FOR_JSON_18_POP1

#define _FOR_JSON_18_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_17_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_18_POP2

#define _FOR_JSON_18_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1, ARG2) \
_FOR_JSON_16_POP2(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_19

#define _FOR_JSON_19 (   POP_N)    _FOR_JSON_19_##POP_N

◆ _FOR_JSON_19_POP1

#define _FOR_JSON_19_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_18_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_19_POP2

#define _FOR_JSON_19_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_1_POP1

#define _FOR_JSON_1_POP1 (   FUNC,
  TYPE,
  ARG1 
)    _FOR_JSON_FINAL(FUNC, TYPE, ARG1)

◆ _FOR_JSON_1_POP2

#define _FOR_JSON_1_POP2 (   FUNC,
  TYPE,
  ARG1 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_2

#define _FOR_JSON_2 (   POP_N)    _FOR_JSON_2_##POP_N

◆ _FOR_JSON_20

#define _FOR_JSON_20 (   POP_N)    _FOR_JSON_20_##POP_N

◆ _FOR_JSON_20_POP1

#define _FOR_JSON_20_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_19_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_20_POP2

#define _FOR_JSON_20_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1, ARG2) \
_FOR_JSON_18_POP2(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_21

#define _FOR_JSON_21 (   POP_N)    _FOR_JSON_21_##POP_N

◆ _FOR_JSON_21_POP1

#define _FOR_JSON_21_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_20_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_22

#define _FOR_JSON_22 (   POP_N)    _FOR_JSON_22_##POP_N

◆ _FOR_JSON_22_POP1

#define _FOR_JSON_22_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_21_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_23

#define _FOR_JSON_23 (   POP_N)    _FOR_JSON_23_##POP_N

◆ _FOR_JSON_23_POP1

#define _FOR_JSON_23_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_22_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_24

#define _FOR_JSON_24 (   POP_N)    _FOR_JSON_24_##POP_N

◆ _FOR_JSON_24_POP1

#define _FOR_JSON_24_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_23_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_25

#define _FOR_JSON_25 (   POP_N)    _FOR_JSON_25_##POP_N

◆ _FOR_JSON_25_POP1

#define _FOR_JSON_25_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_24_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_26

#define _FOR_JSON_26 (   POP_N)    _FOR_JSON_26_##POP_N

◆ _FOR_JSON_26_POP1

#define _FOR_JSON_26_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_25_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_27

#define _FOR_JSON_27 (   POP_N)    _FOR_JSON_27_##POP_N

◆ _FOR_JSON_27_POP1

#define _FOR_JSON_27_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_26_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_28

#define _FOR_JSON_28 (   POP_N)    _FOR_JSON_28_##POP_N

◆ _FOR_JSON_28_POP1

#define _FOR_JSON_28_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_27_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_29

#define _FOR_JSON_29 (   POP_N)    _FOR_JSON_29_##POP_N

◆ _FOR_JSON_29_POP1

#define _FOR_JSON_29_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_28_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_2_POP1

#define _FOR_JSON_2_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_1_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_2_POP2

#define _FOR_JSON_2_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2 
)     _FOR_JSON_FINAL(FUNC, TYPE, ARG1, ARG2)

◆ _FOR_JSON_3

#define _FOR_JSON_3 (   POP_N)    _FOR_JSON_3_##POP_N

◆ _FOR_JSON_30

#define _FOR_JSON_30 (   POP_N)    _FOR_JSON_30_##POP_N

◆ _FOR_JSON_30_POP1

#define _FOR_JSON_30_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_29_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_3_POP1

#define _FOR_JSON_3_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_2_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_3_POP2

#define _FOR_JSON_3_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_4

#define _FOR_JSON_4 (   POP_N)    _FOR_JSON_4_##POP_N

◆ _FOR_JSON_4_POP1

#define _FOR_JSON_4_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_3_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_4_POP2

#define _FOR_JSON_4_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1, ARG2) \
_FOR_JSON_2_POP2(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_5

#define _FOR_JSON_5 (   POP_N)    _FOR_JSON_5_##POP_N

◆ _FOR_JSON_5_POP1

#define _FOR_JSON_5_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_4_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_5_POP2

#define _FOR_JSON_5_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_6

#define _FOR_JSON_6 (   POP_N)    _FOR_JSON_6_##POP_N

◆ _FOR_JSON_6_POP1

#define _FOR_JSON_6_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_5_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_6_POP2

#define _FOR_JSON_6_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1, ARG2) \
_FOR_JSON_4_POP2(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_7

#define _FOR_JSON_7 (   POP_N)    _FOR_JSON_7_##POP_N

◆ _FOR_JSON_7_POP1

#define _FOR_JSON_7_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_6_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_7_POP2

#define _FOR_JSON_7_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_8

#define _FOR_JSON_8 (   POP_N)    _FOR_JSON_8_##POP_N

◆ _FOR_JSON_8_POP1

#define _FOR_JSON_8_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_7_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_8_POP2

#define _FOR_JSON_8_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1, ARG2) \
_FOR_JSON_6_POP2(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_9

#define _FOR_JSON_9 (   POP_N)    _FOR_JSON_9_##POP_N

◆ _FOR_JSON_9_POP1

#define _FOR_JSON_9_POP1 (   FUNC,
  TYPE,
  ARG1,
  ... 
)
Value:
_FOR_JSON_NEXT(FUNC, TYPE, ARG1) \
_FOR_JSON_8_POP1(FUNC, TYPE, ##__VA_ARGS__)

◆ _FOR_JSON_9_POP2

#define _FOR_JSON_9_POP2 (   FUNC,
  TYPE,
  ARG1,
  ARG2,
  ... 
)    INVALID_ODD_ARGS

◆ _FOR_JSON_COUNT_NN

#define _FOR_JSON_COUNT_NN (   ...)    _FOR_JSON_COUNT_NN_WITH_0(DUMMY, ##__VA_ARGS__)

◆ _FOR_JSON_COUNT_NN_WITH_0

#define _FOR_JSON_COUNT_NN_WITH_0 (   ...)

◆ _FOR_JSON_FINAL

#define _FOR_JSON_FINAL (   FUNC,
  ... 
)    FUNC##_FOR_JSON_FINAL(__VA_ARGS__)

◆ _FOR_JSON_NEXT

#define _FOR_JSON_NEXT (   FUNC,
  ... 
)    FUNC##_FOR_JSON_NEXT(__VA_ARGS__)

◆ ADD_SCHEMA_COMPONENTS_OPTIONAL_FOR_JSON_FINAL

#define ADD_SCHEMA_COMPONENTS_OPTIONAL_FOR_JSON_FINAL (   TYPE,
  FIELD 
)
Value:
TYPE, FIELD, #FIELD)
#define ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD)
Definition json.h:490

◆ ADD_SCHEMA_COMPONENTS_OPTIONAL_FOR_JSON_NEXT

#define ADD_SCHEMA_COMPONENTS_OPTIONAL_FOR_JSON_NEXT (   TYPE,
  FIELD 
)     ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD)

◆ ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL

#define ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
TYPE, C_FIELD, JSON_FIELD)
#define ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD)
Definition json.h:486

◆ ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT

#define ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
j["properties"][JSON_FIELD] = \
doc.template add_schema_component<decltype(TYPE::C_FIELD)>();

◆ ADD_SCHEMA_COMPONENTS_REQUIRED_FOR_JSON_FINAL

#define ADD_SCHEMA_COMPONENTS_REQUIRED_FOR_JSON_FINAL (   TYPE,
  FIELD 
)
Value:
TYPE, FIELD, #FIELD)
#define ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, C_FIELD, JSON_FIELD)
Definition json.h:475

◆ ADD_SCHEMA_COMPONENTS_REQUIRED_FOR_JSON_NEXT

#define ADD_SCHEMA_COMPONENTS_REQUIRED_FOR_JSON_NEXT (   TYPE,
  FIELD 
)     ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD)

◆ ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL

#define ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
TYPE, C_FIELD, JSON_FIELD)
#define ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, C_FIELD, JSON_FIELD)
Definition json.h:470

◆ ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT

#define ADD_SCHEMA_COMPONENTS_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
j["properties"][JSON_FIELD] = \
doc.template add_schema_component<decltype(TYPE::C_FIELD)>(); \
j["required"].push_back(JSON_FIELD);

◆ DECLARE_JSON_ENUM

#define DECLARE_JSON_ENUM (   TYPE,
  ... 
)

◆ DECLARE_JSON_OPTIONAL_FIELDS

#define DECLARE_JSON_OPTIONAL_FIELDS (   TYPE,
  ... 
)
Value:
inline void to_json_optional_fields(nlohmann::json& j, const TYPE& t) \
{ \
const TYPE t_default{}; \
_FOR_JSON_COUNT_NN(__VA_ARGS__)(POP1)(WRITE_OPTIONAL, TYPE, ##__VA_ARGS__) \
} \
inline void from_json_optional_fields(const nlohmann::json& j, TYPE& t) \
{ \
_FOR_JSON_COUNT_NN(__VA_ARGS__)(POP1)(READ_OPTIONAL, TYPE, ##__VA_ARGS__) \
} \
inline void fill_json_schema_optional_fields(nlohmann::json& j, const TYPE*) \
{ \
_FOR_JSON_COUNT_NN(__VA_ARGS__) \
(POP1)(FILL_SCHEMA_OPTIONAL, TYPE, ##__VA_ARGS__) \
} \
template <typename T> \
void add_schema_components_optional_fields( \
T& doc, nlohmann::json& j, const TYPE*) \
{ \
_FOR_JSON_COUNT_NN(__VA_ARGS__) \
(POP1)(ADD_SCHEMA_COMPONENTS_OPTIONAL, TYPE, ##__VA_ARGS__); \
}

◆ DECLARE_JSON_OPTIONAL_FIELDS_WITH_RENAMES

#define DECLARE_JSON_OPTIONAL_FIELDS_WITH_RENAMES (   TYPE,
  ... 
)
Value:
inline void to_json_optional_fields(nlohmann::json& j, const TYPE& t) \
{ \
const TYPE t_default{}; \
_FOR_JSON_COUNT_NN(__VA_ARGS__) \
(POP2)(WRITE_OPTIONAL_WITH_RENAMES, TYPE, ##__VA_ARGS__) \
} \
inline void from_json_optional_fields(const nlohmann::json& j, TYPE& t) \
{ \
_FOR_JSON_COUNT_NN(__VA_ARGS__) \
(POP2)(READ_OPTIONAL_WITH_RENAMES, TYPE, ##__VA_ARGS__) \
} \
inline void fill_json_schema_optional_fields( \
nlohmann::json& j, [[maybe_unused]] const TYPE*) \
{ \
_FOR_JSON_COUNT_NN(__VA_ARGS__) \
(POP2)(FILL_SCHEMA_OPTIONAL_WITH_RENAMES, TYPE, ##__VA_ARGS__) \
} \
template <typename T> \
void add_schema_components_optional_fields( \
T& doc, nlohmann::json& j, [[maybe_unused]] const TYPE*) \
{ \
_FOR_JSON_COUNT_NN(__VA_ARGS__) \
(POP2)(ADD_SCHEMA_COMPONENTS_OPTIONAL_WITH_RENAMES, TYPE, ##__VA_ARGS__); \
}

◆ DECLARE_JSON_REQUIRED_FIELDS

#define DECLARE_JSON_REQUIRED_FIELDS (   TYPE,
  ... 
)

◆ DECLARE_JSON_REQUIRED_FIELDS_WITH_RENAMES

#define DECLARE_JSON_REQUIRED_FIELDS_WITH_RENAMES (   TYPE,
  ... 
)

◆ DECLARE_JSON_TYPE

#define DECLARE_JSON_TYPE (   TYPE)    DECLARE_JSON_TYPE_IMPL(TYPE, , , , , , , , )

◆ DECLARE_JSON_TYPE_IMPL

#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"})

◆ DECLARE_JSON_TYPE_WITH_2BASES

#define DECLARE_JSON_TYPE_WITH_2BASES (   TYPE,
  BASE1,
  BASE2 
)
Value:
TYPE, to_json(j, static_cast<const BASE1&>(t)); \
to_json(j, static_cast<const BASE2&>(t)), \
, \
from_json(j, static_cast<BASE1&>(t)); \
from_json(j, static_cast<BASE2&>(t)), \
, \
fill_json_schema(j, static_cast<const BASE1*>(t)); \
fill_json_schema(j, static_cast<const BASE2*>(t)), \
, \
add_schema_components(doc, j, static_cast<const BASE1*>(t)); \
add_schema_components(doc, j, static_cast<const BASE2*>(t)), )
#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)
Definition json.h:611

◆ DECLARE_JSON_TYPE_WITH_BASE

#define DECLARE_JSON_TYPE_WITH_BASE (   TYPE,
  BASE 
)
Value:
TYPE, \
to_json(j, static_cast<const BASE&>(t)), \
, \
from_json(j, static_cast<BASE&>(t)), \
, \
fill_json_schema(j, static_cast<const BASE*>(t)), \
, \
add_schema_components(doc, j, static_cast<const BASE*>(t)), )

◆ DECLARE_JSON_TYPE_WITH_BASE_AND_OPTIONAL_FIELDS

#define DECLARE_JSON_TYPE_WITH_BASE_AND_OPTIONAL_FIELDS (   TYPE,
  BASE 
)
Value:
TYPE, \
to_json(j, static_cast<const BASE&>(t)), \
to_json_optional_fields(j, t), \
from_json(j, static_cast<BASE&>(t)), \
from_json_optional_fields(j, t), \
fill_json_schema(j, static_cast<const BASE*>(t)), \
fill_json_schema_optional_fields(j, t), \
add_schema_components(doc, j, static_cast<const BASE*>(t)), \
add_schema_components_optional_fields(doc, j, t))

◆ DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS

#define DECLARE_JSON_TYPE_WITH_OPTIONAL_FIELDS (   TYPE)
Value:
TYPE, \
, \
to_json_optional_fields(j, t), \
, \
from_json_optional_fields(j, t), \
, \
fill_json_schema_optional_fields(j, t), \
, \
add_schema_components_optional_fields(doc, j, t))

◆ FILL_SCHEMA_OPTIONAL_FOR_JSON_FINAL

#define FILL_SCHEMA_OPTIONAL_FOR_JSON_FINAL (   TYPE,
  FIELD 
)     FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD)

◆ FILL_SCHEMA_OPTIONAL_FOR_JSON_NEXT

#define FILL_SCHEMA_OPTIONAL_FOR_JSON_NEXT (   TYPE,
  FIELD 
)     FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD)

◆ FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL

#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)

◆ FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT

#define FILL_SCHEMA_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
j["properties"][JSON_FIELD] = \
ccf::ds::json::schema_element<decltype(TYPE::C_FIELD)>();

◆ FILL_SCHEMA_REQUIRED_FOR_JSON_FINAL

#define FILL_SCHEMA_REQUIRED_FOR_JSON_FINAL (   TYPE,
  FIELD 
)     FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD)

◆ FILL_SCHEMA_REQUIRED_FOR_JSON_NEXT

#define FILL_SCHEMA_REQUIRED_FOR_JSON_NEXT (   TYPE,
  FIELD 
)     FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD)

◆ FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL

#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)

◆ FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT

#define FILL_SCHEMA_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
j["properties"][JSON_FIELD] = \
ccf::ds::json::schema_element<decltype(TYPE::C_FIELD)>(); \
j["required"].push_back(JSON_FIELD);

◆ FMT_HEADER_ONLY

#define FMT_HEADER_ONLY

◆ JSON_FIELD_FOR_JSON_FINAL

#define JSON_FIELD_FOR_JSON_FINAL (   TYPE,
  FIELD 
)
Value:
ccf::JsonField<decltype(TYPE::FIELD)> \
{ \
#FIELD \
}
Definition json.h:20

◆ JSON_FIELD_FOR_JSON_NEXT

#define JSON_FIELD_FOR_JSON_NEXT (   TYPE,
  FIELD 
)     ccf::JsonField<decltype(TYPE::FIELD)>{#FIELD},

◆ READ_OPTIONAL_FOR_JSON_FINAL

#define READ_OPTIONAL_FOR_JSON_FINAL (   TYPE,
  FIELD 
)     READ_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD)

◆ READ_OPTIONAL_FOR_JSON_NEXT

#define READ_OPTIONAL_FOR_JSON_NEXT (   TYPE,
  FIELD 
)     READ_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD)

◆ READ_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL

#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)

◆ READ_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT

#define READ_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
{ \
const auto it = j.find(JSON_FIELD); \
if (it != j.end()) \
{ \
t.C_FIELD = it->get<decltype(TYPE::C_FIELD)>(); \
} \
}

◆ READ_REQUIRED_FOR_JSON_FINAL

#define READ_REQUIRED_FOR_JSON_FINAL (   TYPE,
  FIELD 
)     READ_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD)

◆ READ_REQUIRED_FOR_JSON_NEXT

#define READ_REQUIRED_FOR_JSON_NEXT (   TYPE,
  FIELD 
)     READ_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD)

◆ READ_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL

#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)

◆ READ_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT

#define READ_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
{ \
const auto it = j.find(JSON_FIELD); \
if (it == j.end()) \
{ \
"Missing required field '" JSON_FIELD "' in object: " + j.dump()); \
} \
try \
{ \
t.C_FIELD = it->get<decltype(TYPE::C_FIELD)>(); \
} \
catch (ccf::JsonParseError & jpe) \
{ \
jpe.pointer_elements.emplace_back(JSON_FIELD); \
throw; \
} \
}
Definition json.h:26

◆ WRITE_OPTIONAL_FOR_JSON_FINAL

#define WRITE_OPTIONAL_FOR_JSON_FINAL (   TYPE,
  FIELD 
)     WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD)

◆ WRITE_OPTIONAL_FOR_JSON_NEXT

#define WRITE_OPTIONAL_FOR_JSON_NEXT (   TYPE,
  FIELD 
)     WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD)

◆ WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_FINAL

#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)

◆ WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT

#define WRITE_OPTIONAL_WITH_RENAMES_FOR_JSON_NEXT (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
{ \
if (t.C_FIELD != t_default.C_FIELD) \
{ \
j[JSON_FIELD] = t.C_FIELD; \
} \
}

◆ WRITE_REQUIRED_FOR_JSON_FINAL

#define WRITE_REQUIRED_FOR_JSON_FINAL (   TYPE,
  FIELD 
)     WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL(TYPE, FIELD, #FIELD)

◆ WRITE_REQUIRED_FOR_JSON_NEXT

#define WRITE_REQUIRED_FOR_JSON_NEXT (   TYPE,
  FIELD 
)     WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT(TYPE, FIELD, #FIELD)

◆ WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_FINAL

#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)

◆ WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT

#define WRITE_REQUIRED_WITH_RENAMES_FOR_JSON_NEXT (   TYPE,
  C_FIELD,
  JSON_FIELD 
)
Value:
{ \
j[JSON_FIELD] = t.C_FIELD; \
}