Как десериализовать массив? - PullRequest
0 голосов
/ 04 октября 2018

Я использую библиотеку nlohmann :: json для сериализации / десериализации элементов в json.Вот как я сериализирую массив C++ типа double:

double mLengths[gMaxNumPoints] = { 1.0, 2.0, 3.0, 4.0, 5.0 };
...
nlohmann::json jsonEnvelope;
jsonEnvelope["lengths"] = envelope.mLengths;

, который выдает:

"lengths":[  
   1.0,
   2.0,
   3.0,
   4.0,
   5.0
]

Но теперь, как я могу десериализовать обратно к mLengths?Пробовал с:

mLengths = jsonData["envelope"]["lengths"];

Но там написано expression must be a modifiable lvalue.Как я могу восстановить массив?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Он работает с вектором:

#include <iostream>
#include <nlohmann/json.hpp>                                                

int main() {
    double mLengths[] = { 1.0, 2.0, 3.0, 4.0, 5.0 };
    nlohmann::json j;
    j["lengths"] = mLengths;
    std::cout << j.dump() << "\n";

    std::vector<double> dbs = j["lengths"];
    for (const auto d: dbs)
        std::cout << d << " ";
    std::cout << "\n";

    return 0;
}

Десериализация с помощью присваивания не будет работать с массивами C, поскольку вы не можете правильно определить оператор преобразования для них.

0 голосов
/ 04 октября 2018

У меня нет библиотеки под рукой, но она должна выглядеть примерно так:

auto const &array = jsonData["envelope"]["lengths"];

if(!array.is_array() || array.size() != gMaxNumPoints) {
    // Handle error, bail out
}

std::copy(array.begin(), array.end(), mLengths);

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

...