Добавить текст в JSON C ++ - PullRequest
0 голосов
/ 22 марта 2019

Есть файл JSON, как мне добавить туда информацию, чтобы прошлое осталось?Сделал что-то подобное, не работает:

QFile File(pathJSONProject);
File.open(QIODevice::ReadOnly | QIODevice::Text);
QJsonParseError JsonParseError;
QJsonDocument JsonDocument = QJsonDocument::fromJson(File.readAll(), &JsonParseError);

QJsonObject json = JsonDocument.object();

json.insert("Расстояние", dlgOpen->distance);
json.insert("Размер", dlgOpen->size);
json.insert("Путь", pathFolder);
QJsonDocument document(json);
File.open(QFile::WriteOnly | QFile::Text | QFile::Truncate);
File.write(document.toJson());
File.close();

Я хочу добавить записи в файл.Не могу этого сделать.Не меняется.

Во-первых, файл такой?Как он должен добавлять новые записи?

{
    "Name": "45",
    "Path": "C:/Users/Dmitry/Desktop/45.json"
}

Как добавить новую запись в массив?

enter image description here

Ответы [ 3 ]

3 голосов
/ 22 марта 2019

Всегда обрабатывайте возвращаемое значение QFile::open(), чтобы проверить, было ли оно успешным или нет.


Существует несколько способов вставить массив в JSON.Вот пример:

#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

int main()
{
    const auto data = R"({ "Name": "45", "Path": "C:\file.json" })";

    auto doc = QJsonDocument::fromJson( data );
    qDebug() << "BEFORE:\n\n"
             << qPrintable( doc.toJson( QJsonDocument::Indented ) );

    // Create an array and add objects
    const auto obj1 = QJsonObject{ { "name", "abc" }, { "default", 11 } };
    const auto obj2 = QJsonObject{ { "name", "xyz" }, { "default", 22 } };

    auto obj = doc.object();
    obj.insert( "array", QJsonArray{ obj1, obj2 } );

    doc.setObject( obj );
    qDebug() << "\nAFTER:\n"
             << qPrintable( doc.toJson( QJsonDocument::Indented ) );

    // Add more objects to array

    const auto obj3 = QJsonObject
    {
        { "name", "def" },
        { "default", 33 },
        { "new1", "1" },
        { "new2", "2" }     // Add any number of objects...
    };

    const auto obj4 = QJsonObject{ { "name", "jkl" }, { "default", 44 } };

    // Get existing array to append more elements
    auto arr = doc.object()[ "array" ].toArray();
    arr.append( obj3 );
    arr.append( obj4 );

    // Set old array to newly updated one
    obj[ "array" ] = arr;

    doc.setObject( obj );
    qDebug() << "\nAFTER THAT:\n"
             << qPrintable( doc.toJson( QJsonDocument::Indented ) );

    return 0;
}

Выход :

BEFORE:

 {
    "Name": "45",
    "Path": "C:\file.json"
}


AFTER:
 {
    "Name": "45",
    "Path": "C:\file.json",
    "array": [
        {
            "default": 11,
            "name": "abc"
        },
        {
            "default": 22,
            "name": "xyz"
        }
    ]
}


AFTER THAT:
 {
    "Name": "45",
    "Path": "C:\file.json",
    "array": [
        {
            "default": 11,
            "name": "abc"
        },
        {
            "default": 22,
            "name": "xyz"
        },
        {
            "default": 33,
            "name": "def",
            "new1": "1",
            "new2": "2"
        },
        {
            "default": 44,
            "name": "jkl"
        }
    ]
}

Кроме того, взгляните на QJsonArray :: fromStringList () и QJsonArray :: fromVariantList () .

1 голос
/ 22 марта 2019

Для изменения данных, приведенных в вашем примере, вам нужно проверить, являются ли содержащиеся в QJsonDocument данные массивом или простым объектом.В вашем случае, я полагаю, вы хотите добавить данные в массив.Попробуйте что-то вроде этого:

// Read the data
const QString filename = "example.json";
QJsonDocument doc = read(filename);

// Check that it's an array and append new data
if (doc.isArray()) {
    auto array = doc.array();
    array.append(QJsonObject{
        {"Name", "mohabouje"}, {"Path", "whatever"}
    });

    array.append(QJsonObject{
        {"Name", "mojito"}, {"Path", "whatever"}
    });
    doc.setArray(array);
}
// Write the new data
write(filename, doc); 

Вспомогательные функции для чтения / записи документов JSON могут избежать ошибки открытия / закрытия файла:

QJsonDocument read(const QString& filename) {
    QFile file(filename);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    const QString val = file.readAll();
    file.close();
    return QJsonDocument::fromJson(val.toUtf8());
}

void write(const QString& filename, const QJsonDocument& document) {
    QFile file(filename);
    file.open(QFile::WriteOnly | QFile::Text | QFile::Truncate);
    file.write(document.toJson());
    file.close();
}
1 голос
/ 22 марта 2019

Проверьте возвращаемое значение

File.open(QFile::WriteOnly | QFile::Text | QFile::Truncate);

Скорее всего, это будет false, поскольку у вас уже есть файл, открытый для доступа ReadOnly, и вы еще не закрыли его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...