Qt修改JSON文件

时间:2013-10-09 08:56:35

标签: c++ json qt

我需要能够读取现有的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"。此代码运行后,文件内容相同。我知道该文件已被写出,因为键值对的顺序已被更改为按字母顺序排列的键排序。

如何让文件重新填充我尝试过的更改?

2 个答案:

答案 0 :(得分:7)

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

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

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);

答案 1 :(得分:1)

您从文件创建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);