Qt c++ json запись в файл

167
26 января 2022, 21:00

я понял как читать json файлы, но как в них писать?

я пробовал так:

 QFile fileJson(":/Json/json/first.json");
 fileJson.open(QIODevice::WriteOnly);
 fileJson.write("Hello!");
 fileJson.close();

но в консоль получил это:

скажите как писать в файлы json с помощью Qt c++!

P.S. в данном примере я просто писал "Hello!", а вы скажите как именно json писать)

QVariantMap dict_;
    dict_.insert("level", 3);
    QFile fileJson("./first.json");
    fileJson.open(QIODevice::WriteOnly);
    fileJson.write(QJsonDocument(QJsonObject::fromVariantMap(dict_)).toJson());
    fileJson.close();

открывается успешно, но не записывает ничего в файл

Answer 1

Для того, чтобы записать строку в формате json, следует создать объект класса QJsonObject, инициализировать его данными (в моем примере из объекта класса QVariantMap, но это необязательно делать именно так), преобразовать в QByteArray с помощью QJsonDocument и записать эту последовательность байтов в файл, точно так, как вы это делаете в своем примере:

 QFile fileJson("./first.json"); //тут я записываю файл в текущей директории
 fileJson.open(QIODevice::WriteOnly); //все верно, если файла нет, он будет создан
 QVariantMap testMap; //тестовые данные, может быть все, что угодно
 testMap.insert("msg", "Hello!");
 testMap.insert("level", 5);
 fileJson.write(QJsonDocument(QJsonObject::fromVariantMap(testMap)).toJson());
 fileJson.close();

Как вариант, функцию toJson можно вызвать с параметром QJsonDocument::Compact (если не требуется "человекочитаемость"):

fileJson.write(QJsonDocument(QJsonObject::fromVariantMap(testMap)).toJson(QJsonDocument::Compact));

Результат действия программы (содержимое файла first.json):

{
    "level": 5,
    "msg": "Hello!"
}

или (при использовании QJsonDocument::Compact):

{"level":5,"msg":"Hello!"}

Что же касается файла ресурсов, то данные туда записываются при компиляции проекта, "легальных" способов динамичной записи Qt не предоставляет, да я и не вижу в таком хакинге особого смысла, так как для этого существуют прекрасные обычные файлы файловой системы.

Answer 2

Как вы уже заметили, вы получали ошибку QIODevice::write из-за некорректного открытия файла, так как вы использовали некорректный абсолютный путь к вашему файлу. Попробуйте использовать QJsonValue вместо QVariantMap, как альтернативный вариант формирования QJsonObject:

    QJsonObject jObj;
    jObj.insert("msg", QJsonValue::fromVariant(QVariant("Hello")));

Для записи в файл вы можете воспользоваться примером из моей библиотеки QSerializer:

    void writeToJsonFile(QJsonObject jObj)
    {
        QJsonDocument jDoc(jObj);
        QFile file("./first.json");
        if(file.open(QIODevice::WriteOnly))
        {
            file.write(QString(jDoc.toJson()).toStdString().c_str());
            file.close();
        }
    }

Mетод QJsonDocument::toJson возвращает QByteArray, остается только обернуть его в QString и получить const char* на данные QString. Однако, обратите внимание, что toJson возвращает JSON в кодировке UTF-8.

READ ALSO
Наложение двух картинок (C#)

Наложение двух картинок (C#)

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

98
HtmlAgilityPack Как спарсить данные и положить их в коллекцию?

HtmlAgilityPack Как спарсить данные и положить их в коллекцию?

Использую код с сайта, он работает и с ним все хорошоНо я не понимаю принципа

156
Как отследить изменение DisplayIndex DataGridView у Column C#

Как отследить изменение DisplayIndex DataGridView у Column C#

Мне нужно отследить, что пользователь менял столбцы местами, но такого события я не обнаружилПодскажите как это можно реализовать

173
Как построить linq?

Как построить linq?

Как сформировать linq запрос чтобы, поле Clients было заполнено через запятую кратким названием организации?

85