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()所有返回数据的副本,而不是引用。有两种不同的方法来处理这个问题。

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 回答