Skip to content

ArrayJson

Владимир Мигашко edited this page Sep 5, 2016 · 7 revisions

<< Назад

Сериализация json-массивов поддерживаться для классических си-массивов и некоторых STL-контейнеров:

  • V[N]
  • std::vector
  • std::deque
  • std::list
  • std::set
  • std::multiset
  • std::unordered_set
  • std::unordered_multiset
  • std::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-контейнеры перед десериализацией очищаются и заполняются без ограничения.

<< Назад

Clone this wiki locally