я понял как читать 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();
открывается успешно, но не записывает ничего в файл
Для того, чтобы записать строку в формате 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 не предоставляет, да я и не вижу в таком хакинге особого смысла, так как для этого существуют прекрасные обычные файлы файловой системы.
Как вы уже заметили, вы получали ошибку 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.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Делаю программуПонадобилось наложение двух картинок, которые будут задаваться в методе
Использую код с сайта, он работает и с ним все хорошоНо я не понимаю принципа
Мне нужно отследить, что пользователь менял столбцы местами, но такого события я не обнаружилПодскажите как это можно реализовать
Как сформировать linq запрос чтобы, поле Clients было заполнено через запятую кратким названием организации?