Возникли проблемы при открытии файла JSON в C ++ - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь открыть файл json, с которым я буду работать в C ++. Код, который я успешно использовал раньше, не может открыть файл. Я использую Visual Studio 2017 в Windows 10 Pro с JSON для Modern C ++ версии 3.5.0.

У меня есть очень простая функция, которая должна открывать файл в качестве входных данных для объекта json. Кажется, что файл открывается, но прерывается при записи его в объект json. Первоначально открываемый файл находился в другом каталоге, но я переместил его в тот же каталог, что и исполняемый файл во время тестирования ... но это не помогло.

Вот очень короткая функция, которая не работает:

json baselineOpenAndRead(string fileName) //passed string used for filename 
{

    json baseJObject;
    cout << "we have a baseJObject" << endl;

    //ifstream inFileJSON("test_file.json");  // Making this explicit made no difference
    ifstream inFileJSON;
    inFileJSON.open("test_file.json", ifstream::in); 
    cout << "we have opened json inFileJSON" << endl; // get here


    inFileJSON >> baseJObject;
    cout << " Can direct inFileJSON into baseJObject" << endl; //never get here; the app aborts.
    inFileJSON.close();
    return baseJObject;
}

Кажется, что это в основном идентично примеру на сайте nlohmann:

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

Я просто ожидал, что это откроет файл json, загрузит его в объект и вернет объект. Вместо этого просто выходит.

Спасибо за любые мысли ... то есть, что я делаю не так? (Я собираюсь игнорировать, что это работало раньше ... может быть, я что-то пропустил).

- Al

В соответствии с просьбой, приведен минимальный воспроизводимый пример, но этодля компиляции потребуется nlohmann's json.hpp:

#include <iostream>
#include <fstream>
#include "json.hpp"

using json = nlohmann::json;
using namespace std;

string fileName;
json baselineOpenAndRead(string);

int main(int argC, char *argV[])
{
    json baseJObject;

    if (argC != 2) // check to make sure proper number of arguments are given.
    {
        cout << "\n\nFilename needed...";
        exit(1); // number of arguments is wrong - exit program
    }
    else
    {
        fileName = argV[1];
        baseJObject = baselineOpenAndRead(fileName); // opens and reads the Base Line JSON file
        cout << "baseJObject returned" << endl;
    }
    return 0;
}

json baselineOpenAndRead(string fileName) // 
{
    cout << "File name: " << fileName << endl;
    json baseJObject;
    cout << "we have a baseJObject" << endl;

    ifstream inFileJSON(fileName);

    if (inFileJSON.is_open())
    {
        cout << "file open..." << endl;
        if (nlohmann::json::accept(inFileJSON))
        {
            cout << "valid json" << endl;
            try { inFileJSON >> baseJObject; }
            catch (const std::exception &e) { std::cout << e.what() << '\n'; throw; }
        }
        else
        {
            cout << "not valid json" << endl;
        }
    }
    else
    {
        cout << "file not really open" << endl;
    }
    inFileJSON >> baseJObject;
    cout << " We can echo inFileJSON into baseJObject" << endl;
    inFileJSON.close();
    return baseJObject;
}

Я проверил его с помощью этого файла json:

{
    "people": [{
            "name": "Scott",
            "website": "stackabuse.com",
            "from": "Nebraska"
        },
        {
            "name": "Larry",
            "website": "google.com",
            "from": "Michigan"
        },
        {
            "name": "Tim",
            "website": "apple.com",
            "from": "Alabama"
        }
    ]
}

Когда я запускаю эту передачу, json выше какdata.json, я получаю следующий вывод, а затем он выходит:

./Test_json data.json
File name: data.json
we have a baseJObject
file open...
valid json
[json.exception.parse_error.101] parse error at line 1, column 1: syntax error while parsing value - unexpected end of input; expected '[', '{', or a literal

Без попытки, он просто выходит. Он никогда не пройдет inFileJSON >> baseJObject;

Еще одна попытка, которая, кажется, работает, но почему?

ОК. Я пробовал это с той же основной (единственные изменения в функции):

json baselineOpenAndRead(string fileName) // 
{

    json baseJObject;
    string filePath = "../baselines/" + fileName;
    cout << "filePath: " << filePath << endl;
    ifstream inFileJSON(fileName);
    //baseJObject = json::parse(inFileJSON);
    inFileJSON >> baseJObject;
    cout << baseJObject << std::endl;
    return baseJObject;
}

Это выглядит в принципе то же самое для меня. Я попытался сделать это ifstream inFileJSON (fileName.c_str ()) как на оригинале, так и на этом. Оригинал продолжал терпеть неудачу, этот продолжал работать. Извините, это так долго, но я не могу получить достойное форматирование комментариев ... Должен ли я просто попытаться ответить на свой вопрос вместо этого?

1 Ответ

0 голосов
/ 15 октября 2019

Я думаю, что получил это. Я считаю, что моя первоначальная проблема была вызвана ошибкой ',' в одном из моих файлов теста json. Впоследствии if (inFileJSON.is_open) работал, но if (nlohmann :: json :: accept (inFileJSON) не работал и вызывал ту же (или, возможно, похожую) ошибку). Я подумал, что мне нужен c_str () для путей к файлам вне каталога исполняемого файла, но, похоже, это не имеет значения, так или иначе. Я убрал accept (), и этот код, кажется, работает согласованно:

json baselineOpenAndRead(string fileName) // 
{
    json baseJObject;
    cout << "we have a baseJObject" << endl;
    string filePath = "../baselines/" + fileName;
    cout << "filePath: " << filePath << endl;
    //ifstream inFileJSON(filePath.c_str());
    ifstream inFileJSON(filePath);

    if (inFileJSON.is_open())
    {
        cout << "File is open." << endl;
        inFileJSON >> baseJObject;
        cout << baseJObject << std::endl;
        inFileJSON.close();
        return baseJObject;
    }
    else
    {
        cout << "File not open." << endl;
        exit(1);
    }
}

Спасибо всем за помощь. Я ценю это.

- Al

...