Читать Json объекту - PullRequest
       63

Читать Json объекту

0 голосов
/ 07 апреля 2020

Я сейчас пытаюсь прочитать json файл в объект. Я использую версию nlohmann- json 3.7.3. Я следовал примеру кода в этой документации, который выглядит следующим образом:

// read a JSON file
std::ifstream i("file.json");
json j;
i >> j;

Моя реализация для этого заключалась в том, чтобы иметь простую функцию, которая возвращает объект json, так просто:

nlohmann::json UTSF::readJSONFile(std::string filename)
{ 
       std::ifstream i("file.json");
       json j;
       i >> j;
       return j;
}

Я получаю следующую ошибку no operator ">>" matches these operands operand types are: json >> std::ifstream

Так что я провел некоторое расследование, что этот способ больше не используется в версии 3.7.3. Я также изучил использование json.parse и не сработал.

Какой самый актуальный способ сделать это для nlohmann-jsonversion 3.7.3? У меня также есть похожие проблемы с записью json в файл

Это минимальный воспроизводимый пример, который я написал, который дает мне ту же ошибку;

#include <iostream>
#include <nlohmann/json.hpp>
#include <fstream>
using json = nlohmann::json;

nlohmann::json readJSONFile(std::string filename)
{
    std::ifstream i(filename);
    json j;
    i >> j;
    return j;
}

int main()
{
    nlohmann::json x;
    x = readJSONFile("file.json");
    std::cout << x.dump(4) << std::endl;
}

Error list

1 Ответ

0 голосов
/ 07 апреля 2020

Для nlohmann я использую эту простую функцию

#include <nlohmann/json.hpp>

....

nlohmann::json ReadJsonFromFile(std::string file_name) {

    try {
        return nlohmann::json::parse(std::ifstream{file_name, std::ios::in});
    } catch (nlohmann::json::parse_error& e) {
        std::cerr << "JSON parse exception : " << e.what() << std::endl;
    } catch (std::ifstream::failure& e) {
        std::cerr << "Stream exception : " << e.what() << std::endl;
    } catch (std::exception& e) {
        std::cerr << "Exception : " << e.what() << std::endl;
    } catch (...) {
        std::cerr << "Unk error" << std::endl;
    }

    return {};
}
...