Qt5的json读取和新建接口都挺方便的,但是对现有文件进行修改,用起来感觉很不方便,pugixml的接口感觉就做的非常好了,下面对修改方法进行一下记录。
示例代码
//构建测试数据
QJsonObject json;
QJsonArray array;
for(int i = 0; i < 3; i++)
{
QJsonObject obj;
obj.insert("key" + QString::number(i), i);
array.append(obj);
}
json.insert("dat", array);
//QJsonObject({"dat":[{"key0":0},{"key1":1},{"key2":2}]})
qDebug() << json;
//修改原始数据
for(QJsonArray::Iterator it = array.begin(); it != array.end(); it++)
{
QJsonObject obj = it[0].toObject();
obj.insert("value", it.i);
it[0] = obj;
}
json["dat"] = array;
//QJsonObject({"dat":[{"key0":0,"value":0},{"key1":1,"value":1},{"key2":2,"value":2}]})
qDebug() << json;
- 坑1
这里有个容易出差的地方,如果通过下面的方式得到的object是只读的,所以你修改obj的值,并不能修改array中的值。
QJsonObject obj = array.at(0);
- 坑2
需要通过 “QJsonArray::Iterator” 来获取数据的指针,来达到修改的目的,在遍历"QJsonArray"的时候,获取当前元素是用"it[0]",看一下"QJsonArray::Iterator"的函数,我们发现它有两个成员变量"a"和"i",分别指向的是数组的指针和当前数组元素的索引,当"it++"的时候,“i"的值会自增,所以获取当前的值就是用"it[0]”
- 坑3
通过[]获取引用值,从而修改原始值,或者通过=来覆盖原来的值
it[0] = obj;
json["dat"] = array;