3

既存の JSON ファイルを読み取り、それに変更を加えて (オブジェクト、配列、キーと値のペアの置換、削除、追加など)、ファイルを再度書き出せる必要があります。

次の内容の JSON ファイルを読み書きしようとしています。

{
    "array": [
        {
            "name": "Channel",
            "default": 1

        },
        {
            "name": "Size",
            "default": 457
        }
    ]
}

ファイルを正常に読み込んでいますが、次のコードを使用してファイルを変更できません。

QFile File("/path/to/myfile.json");
File.open(QIODevice::ReadOnly | QIODevice::Text);

QJsonParseError JsonParseError;
QJsonDocument JsonDocument = QJsonDocument::fromJson(File.readAll(), &JsonParseError);

File.close();

QJsonObject RootObject = JsonDocument.object();
QJsonArray Array = RootObject.value("array").toArray();

QJsonObject ElementOneObject = Array.at(0).toObject();

ElementOneObject.insert("key", QJsonValue(QString("value")));
ElementOneObject.insert("name", QJsonValue(QString("David")));

File.open(QFile::WriteOnly | QFile::Text | QFile::Truncate);
File.write(JsonDocument.toJson());
File.close();

配列の最初の要素が「David」という新しい名前と、のような新しいキーと値のペアを持つことを期待しています"key" : "value"。このコードの実行後、ファイルの内容は同じです。キーと値のペアの順序が、アルファベット順にソートされたキーによって順序付けられるように変更されているため、ファイルが書き出されたことがわかります。

加えようとした変更をファイルに反映させるにはどうすればよいですか?

4

2 に答える 2

10

質問の例が機能しない理由はJsonDocument.object()RootObject.value("array").toArray()およびArray.at(0).toObject()all が参照ではなくデータのコピーを返すためです。これを処理するには、2 つの異なる方法があります。

1)要素に変更を加えた後、それを配列のコピーに挿入し、次に配列をコピーに挿入してRootObjectからRootObjectJsonDocument

Array.removeAt(0);
Array.insert(0, ElementOneObject);
RootObject.insert("array", Array);
JsonDocument.setObject(RootObject);

2)find()変更したいオブジェクト/値への参照を取得するために使用します

QJsonObject RootObject = JsonDocument.object();
QJsonValueRef ArrayRef = RootObject.find("array").value();
QJsonArray Array = ArrayRef.toArray();

QJsonArray::iterator ArrayIterator = Array.begin();
QJsonValueRef ElementOneValueRef = ArrayIterator[0];

QJsonObject ElementOneObject = ElementOneValueRef.toObject();

// Make modifications to ElementOneObject

ElementOneValueRef = ElementOneObject;
ArrayRef = Array;
JsonDocument.setObject(RootObject);
于 2013-10-15T08:03:45.283 に答える
2

ファイルから Json ドキュメントを作成し、最初の (ルート) アイテムである RootObject を取得します。これは JsonDocument のルート項目への参照ではなく、コピーです。

したがって、変更されたルート アイテムから新しい JsonDocument を作成し、それを保存します。

QJsonDocument doc(RootObject);

File.open(QFile::WriteOnly | QFile::Text | QFile::Truncate);
File.write(doc.toJson());
File.close();

または、最初に作成した QJsonDocument にルート オブジェクトを戻すだけのこの関数があります。

void QJsonDocument::setObject(const QJsonObject & object)

保存する前に、電話してみてください

JsonDocument.setObject(RootObject);
于 2013-10-09T09:14:58.993 に答える