吐槽:在百度关于修改Json文件内容时看了几篇博客,无一例外文章都是雷同的,而且说的也不详细,没有详细的验证结果是否有问题就发了出来,这样无疑会给我们带来不必要的麻烦。
读取:
从文件中读取json数据是很容易的,以c++ qt环境为例读取以下数据:
{
"projects": [
{
"lastSaveTime": "2021-01-18 14:25:05",
"name": "Fotosifter Project",
"path": "C:/Users/xx/Desktop/Fotosifter Project.fsp",
"uid": "{93a515e7-03cf-450b-8652-3ffa20529c71}"
},
{
"lastSaveTime": "2021-01-18 14:38:26",
"name": "Fotosifter Project2",
"path": "D:/Fotosifter Project2.fsp",
"uid": "{1ce2147e-4817-46df-8c0e-05000ab50f67}"
},
{
"lastSaveTime": "2021-01-19 14:32:03",
"name": "Fotosifter Project3",
"path": "D:/Fotosifter Project3.fsp",
"uid": "{1ce2147e-2kjd-46df-8c0e-05000a15645d}"
}
]
}
读取的代码:
QFile fi(m_prosPath);
fi.open(QIODevice::ReadOnly);
QJsonParseError json_error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(fi.readAll(), &json_error);
fi.close();
QJsonObject rootObj = jsonDoc.object();
if (rootObj.contains(QStringLiteral("projects")))
{
QJsonValue arrayValue = rootObj.value(QStringLiteral("projects"));
if (arrayValue.isArray())
{
QJsonArray array = arrayValue.toArray();
int nCount = array.count();
for (int i = 0; i < nCount; i++)
{
QJsonValue iconArray = array.at(i);
QJsonObject icon = iconArray.toObject();
PROINFO pro;
pro.name = icon["name"].toString();
pro.uid = icon["uid"].toString();
pro.p.path4Save = icon["path"].toString();
pro.p.lasSaveTime = icon["lastSaveTime"].toString();
}
}
}
修改:(修改包括增删改,以删除为例*
此时如果我们要删除uid为 {93a515e7-03cf-450b-8652-3ffa20529c71}的这条数据,其实就是将所有数据重新写入文件:
QFile fi(m_prosPath);
fi.open(QIODevice::ReadWrite);
QJsonParseError json_error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(fi.readAll(), &json_error);
fi.close();
QJsonObject rootObj = jsonDoc.object();
if (rootObj.contains(QStringLiteral("projects")))
{
QJsonValue arrayValue = rootObj.value(QStringLiteral("projects"));
if (arrayValue.isArray())
{
QJsonArray dstArry;
QJsonArray array = arrayValue.toArray();
int nCount = array.count();
for (int i = 0; i < nCount; i++)
{
QJsonValue iconArray = array.at(i);
QJsonObject icon = iconArray.toObject();
QString strUID = icon["uid"].toString();
if (strUID == "{93a515e7-03cf-450b-8652-3ffa20529c71}")
continue;
else
dstArry.append(icon);
}
//重新写入,QIODevice::Truncate表示以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头,如果不添加这个,则会导致文件最下面的数据不会被覆盖。
QFile fi2(m_prosPath);
if (fi2.open(QIODevice::ReadWrite | QIODevice::Truncate))
{
rootObj["projects"] = dstArry;//重新赋值
jsonDoc.setObject(rootObj);
fi2.write(jsonDoc.toJson());//写入文件
fi2.close();
}
}
}
删除后的数据:
{
"projects": [
{
"lastSaveTime": "2021-01-18 14:38:26",
"name": "Fotosifter Project2",
"path": "D:/Fotosifter Project2.fsp",
"uid": "{1ce2147e-4817-46df-8c0e-05000ab50f67}"
},
{
"lastSaveTime": "2021-01-19 14:32:03",
"name": "Fotosifter Project3",
"path": "D:/Fotosifter Project3.fsp",
"uid": "{1ce2147e-2kjd-46df-8c0e-05000a15645d}"
}
]
}
假如不添加QIODevice::Truncate,则写入后的数据有问题,其实就是新旧数据重叠了,如下:
{
"projects": [
{
"lastSaveTime": "2021-01-18 14:38:26",
"name": "Fotosifter Project2",
"path": "D:/Fotosifter Project2.fsp",
"uid": "{1ce2147e-4817-46df-8c0e-05000ab50f67}"
},
{
"lastSaveTime": "2021-01-19 14:32:03",
"name": "Fotosifter Project3",
"path": "D:/Fotosifter Project3.fsp",
"uid": "{1ce2147e-2kjd-46df-8c0e-05000a15645d}"
},
{
"lastSaveTime": "2021-01-19 14:32:03",
"name": "Fotosifter Project3",
"path": "D:/Fotosifter Project3.fsp",
"uid": "{1ce2147e-2kjd-46df-8c0e-05000a15645d}"
}
]
}