Открытие файла JSON, давая посадки - PullRequest
0 голосов
/ 26 октября 2019

У нас есть проблема с открытием файлов json в C ++ с использованием Visual Studio 2017 в Windows 10 Pro (мы используем nlohmann json.hpp 3.7.0), и это, похоже, динамическая ошибка (из-за отсутствия лучшего термина). Иногда мы пишем код, и он работает нормально, а иногда нет. Мы думали, что это связано с кодировкой файлов json (UTF-8, ASCII и т. Д.), Но теперь это, кажется, не имеет значения. Включенный здесь код не работает, но очень похожий код в других программах работает.

Мы объявляем объект json, но когда мы пытаемся прочитать файл из объекта json, программа завершается неудачно. Однако, если мы просто читаем тот же файл с помощью getline (), мы читаем файл просто отлично. Мы не понимаем, что делаем неправильно. Ниже приведена функция (с некоторыми отладочными файлами), с которой мы работали. Цикл while, который читает файл с помощью getline (), работает отлично. однако чтение файла в объект json с помощью "inFileJSON >> 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.

У нас естьчитать файлы JSON в объекты JSON, как это раньше, и не было этой проблемы. Прямо сейчас это очень согласованно. Он печатает имя infile и прерывает его, как только он набирает 'InFileJSON >> baseJObject;' Мы что-то не так делаем с тем, как мы читаем файл? Предложения? Похоже, что это стандартный механизм для чтения файла json в объект json: https://github.com/nlohmann/json/issues/351.

Если бы он не работал только с нашими большими файлами, я бы заподозрил их, но приведенный выше json довольно прост. Мы даже попытались удалить оболочку массива из файла, и это не имело никакого значения.

json baselineOpenAndRead(string fileName) // 
{
    json baseJObject;
    string filePath = fileName + "_base.json";  
    ifstream inFileJSON(filePath); // name of baseline file 

    //string line;
    // I should have been clearer
    //This while loop was only added to test whether
    // I could open and read the file
    // In my actual function, I am not doing this.
    //I am going straight to the inFileJSON >> baseJObject;
    //That is what fails; I have commented this out here to make
    // things clearer
/* Debug code
    if (inFileJSON.is_open())
    {
        cout << "i'm open" << endl;
        while (getline(inFileJSON , line)) //this works
        {
        cout << line << '\n';
        }
    }
*/
    cout << "infile: " << filePath << endl; //this prints
    inFileJSON >> baseJObject; //we abort here
    cout << "past >>: " << endl;
    inFileJSON.close();
    cout << "past close" << endl;
    cout << "size: " << baseJObject.size() << endl;
    return baseJObject;
}

Мы хотим прочитать содержимое файла в объект json для дальнейшей обработки. Прямо сейчас, это просто терпит неудачу с окном, заявляющим, что abort () был вызван. Больше всего нас беспокоит «динамический» аспект, упомянутый в первом абзаце. Этот же код работал. Может ли это быть что-то кроме кода?

Мы будем благодарны за любые мысли, которые могут возникнуть у кого-либо.

Спасибо -

Al

...