我需要能够读取现有的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"
。此代码运行后,文件内容相同。我知道该文件已被写出,因为键值对的顺序已被更改为按字母顺序排列的键排序。
如何让文件重新填充我尝试过的更改?
答案 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);