我需要能够读取现有的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".此代码运行后,文件内容相同.我知道该文件已被写出,因为键值对的排序已被更改为按字母顺序排序的键排序.
我如何让文件重新填充我试图做的更改?
问题中的示例不起作用的原因是因为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);
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)
| 归档时间: |
|
| 查看次数: |
10377 次 |
| 最近记录: |