JSON к массиву структур в nlohmann json lib - PullRequest
0 голосов
/ 20 февраля 2020

Я недавно задал этот вопрос о преобразовании массива объектов в вектор структур. Я хочу сделать то же самое, но вместо векторов я хочу массив. Например

[
  {
    "Name": "Test",
    "Val": "TestVal"
  },
  {
    "Name": "Test2",
    "Val": "TestVal2"
  }
]

И хотите массив этих структур:

struct Test {
  string Name;
  string Val;
};

Как это может быть возможно? Я новичок в c ++, поэтому, если я делаю что-то не так, пожалуйста, скажите.

1 Ответ

2 голосов
/ 21 февраля 2020

Самое простое, что вы можете сделать, это использовать, где вы можете, std::array вместо C массивов. std::array - это аналог C ++ для простых массивов, который добавляет все полезные вещи из std::vector, такие как size() и итераторы. Вы также можете вернуть их из функций, в отличие от C массивов.

nlohmann также поддерживает их автоматически:

auto parsed = json.get<std::array<Test, 2>>();

Не уверен насчет поддержки библиотек для простых старых C массивов. Но вы можете написать вспомогательную функцию с небольшим шаблоном magi c:

template <typename T, size_t N>
void from_json(const nlohmann::json& j, T (&t)[N]) {
    if (j.size() != N) {
        throw std::runtime_error("JSON array size is different than expected");
    }
    size_t index = 0;
    for (auto& item : j) {
        from_json(item, t[index++]);
    }
}

Использование:

Test my_array[N];
from_json(json, my_array);

Демо: https://godbolt.org/z/-jDTdj

...