Qt修改JSON文件

ogg*_*ter 1 c++ qt json

我需要能够读取现有的JSON文件,对其进行修改(例如替换,删除和添加对象,数组和键值对),然后再次将文件写出来.

我正在尝试使用以下内容读取和写入JSON文件:

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

        },
        {
            "name": "Size",
            "default": 457
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我正在成功读取该文件,但未能使用以下代码对其进行任何更改:

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();
Run Code Online (Sandbox Code Playgroud)

我期待看到数组的第一个元素有一个新名称"大卫"和一个新的键值对"key" : "value".此代码运行后,文件内容相同.我知道该文件已被写出,因为键值对的排序已被更改为按字母顺序排序的键排序.

我如何让文件重新填充我试图做的更改?

ogg*_*ter 7

问题中的示例不起作用的原因是因为JsonDocument.object(),RootObject.value("array").toArray()并且Array.at(0).toObject()所有数据都返回副本,而不是引用.有两种不同的方法来处理这个问题.

1)在对元素进行更改后,将其插入到数组的RootObject副本中,然后将数组插入副本中,然后将其设置RootObjectJsonDocument

Array.removeAt(0);
Array.insert(0, ElementOneObject);
RootObject.insert("array", Array);
JsonDocument.setObject(RootObject);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)