c++修改Json文件内容

吐槽:在百度关于修改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}"
        }
    ]
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值