-
Notifications
You must be signed in to change notification settings - Fork 7
ArrayJson
Владимир Мигашко edited this page Sep 5, 2016
·
7 revisions
Сериализация json-массивов поддерживаться для классических си-массивов и некоторых STL-контейнеров:
V[N]std::vectorstd::dequestd::liststd::setstd::multisetstd::unordered_setstd::unordered_multisetstd::array
У STL-контейнеров реализована специализация только по первому параметру - для аллокаторов и компараторов отличных от дефолтных, нужно реализовать соответствующую специализацию.
template<typename T, int R = -1>
struct array;-
T - описание контейнера в формате
std::контейнер<JSON> - R - размер резерва (для массивов не используется)
Пример для вектора целых чисел:
// сериализуемый контейнер
typedef std::vector< std::vector<int> > vvint;
typedef wjson::value<int> int_json;
// вектор int-ов
typedef wjson::array< std::vector< int_json >, 64 > vint_json;
// вектор векторов
typedef wjson::array< std::vector< vect_int_json, 64 > vvint_json;Трехмерный массив:
typedef int vint_t[3];
typedef vint_t vvint_t[3];
typedef vvint_t vvvint_t[3];
typedef wjson::value<int> int_json;
typedef wjson::array< int_json[3] > vint_json;
typedef wjson::array< vint_json[3] > vvint_json;
typedef wjson::array< vvint_json[3] > vvvint_json;
vvvint_t vvvint ={
{
{100, 101, 102},
{110, 111, 112},
{120, 121, 122}
},
{
{200, 201, 202},
{210, 211, 212},
{220, 221, 222}
},
{
{300, 301, 302},
{310, 311, 312},
{320, 321, 322}
}
};
std::string json="[ [[]], [[1]], [[2], [3]], [[4], [5, 6] ] ]";
vvvint_json::serializer()(vvvint, json.begin(), json.end(), NULL);
json.clear();
vvvint_json::serializer()(vvvint, std::back_inserter(json));
std::cout << json << std::endl;Вывод:
[
[
[100,101,102],
[110,111,112],
[120,121,122]
],
[
[1,201,202],
[210,211,212],
[220,221,222]
],
[
[2,301,302],
[3,311,312],
[320,321,322]
]
]Обратите внимание, что при десериализации си-массивы не обнуляются, а "лишние" элементы игнорируються. STL-контейнеры перед десериализацией очищаются и заполняются без ограничения.