Json文件在c++中的使用

最近想学习以下json,由于本人所使用的的框架是wxwidgets,而wxJson已经很多年没有更新了,所以随着版本的变迁这个工具已经在3.0的版本下不易于使用了(我测试的结果式不能使用),所以我转向了现在维护性更好的qt来学习json。
1.什么是json
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
其实就是一种类似于xml的被别人约定好的数据格式。便于存储接解析。
2.怎么书写json文件

{
	"int":1,
	"bool":true,
	"string":"str"
}

这是我认为最简单的json文件书写格式。不同于xml的书写规则,json文件可以直接已{}开头,且他可以直接以数字作为书写元素而不必使用“”;
3.读取xml

void Widget::ReadJson()
{
	if (!QFile::exists("2.json"))
	{
		return;
	}
    QFile file("2.json");
	file.open(QFile::ReadOnly);
    if(!file.isOpen())
    {
        qDebug()<<"open json file error";
        return;
    }
    QByteArray arry = file.readAll();
    file.close();
    QJsonParseError error;
    QJsonDocument doc(QJsonDocument::fromJson(arry,&error));//加载
    if(error.error != QJsonParseError::NoError)
    {
        qDebug()<<"json file load error";
        return;
    }

    QJsonObject jsonObj = doc.object();//转换位对象
	if(jsonObj.contains("int"))
	{
		QJsonValue vale = jsonObj.value("int");
		if (vale.isDouble())
		{
			int a = vale.toInt();
		}
	}
	if (jsonObj.contains("bool"))
	{
		QJsonValue vale = jsonObj.value("bool");
		if (vale.isBool())
		{
			bool bFlag = vale.toBool();
		}
	}
	if (jsonObj.contains("string"))
	{
		QJsonValue vale = jsonObj.value("string");
		if (vale.isString())
		{
			QString str = vale.toString();
		}
	}

}

读取json文件可以直接使用qt所提供的QJsonDocument、 QJsonObject、QJsonValue来完成。
QJsonDocument:
QJsonDocument 类用于读和写 JSON 文档
一个 JSON 文档可以使用 QJsonDocument::fromJson() 从基于文本的表示转化为 QJsonDocument, toJson() 则可以反向转化为文本。解析器非常快且高效,并将 JSON 转换为 Qt 使用的二进制表示。
已解析文档的有效性,可以使用 !isNull() 进行查询。
如果要查询一个 JSON 文档是否包含一个数组或一个对象,使用 isArray() 和 isObject()。包含在文档中的数组或对象可以使用 array() 或 object() 检索,然后读取或操作。
QJsonArray:
QJsonArray 类封装了一个 JSON 数组。
JSON 数组是值的列表。列表可以被操作,通过从数组中插入和删除QJsonValue 。
一个 QJsonArray 可以和一个 QVariantList 相互转换。可以使用 size() 来查询条目的数量,通过 insert() 在指定索引处插入值,removeAt() 来删除指定索引的值。
QJsonObject:
QJsonObject 类封装了一个 JSON 对象。
一个 JSON 对象是一个“key/value 对”列表,key 是独一无二的字符串,value由一个 QJsonValue 表示。
一个 QJsonObject 可以和一个 QVariantMap 相互转换。可以使用 size() 来查询“key/value 对”的数量,通过 insert() 插入“key/value对”, remove() 删除指定的 key。
QJsonValue:
QJsonValue 类封装了一个值。
JSON 中的值有 6 种基本数据类型:
bool(QJsonValue::Bool)
double(QJsonValue::Double)
string(QJsonValue::String)
array(QJsonValue::Array)
object(QJsonValue::Object)
null(QJsonValue::Null)
一个值可以由任何上述数据类型表示。此外,QJsonValue 有一个特殊的标记来表示未定义的值,可以使用isUndefined() 查询。
值的类型可以通过 type() 或 isBool()、isString()等访问函数查询。同样地,值可以通过 toBool()、toString()等函数转化成相应的存储类型。
QJsonParseError:
QJsonParseError 类用于在 JSON 解析中报告错误。
错误我在这篇博客中有看到详情
如果只是表示一个json对象对使用json来说太过于浅陋,但我查看QJsonValue的时候也发现了isObject()和toObject()函数。所以我们可以写一个多个对象的json文件来测试下

{
	"test1": {
		"int": 1
	},
	"test2": {
		"bool": true
	}
}

读取代码:

if (jsonObj.contains("test1"))
	{
		QJsonValue vale = jsonObj.value("test1");
		QJsonObject obj;
		if (vale.isObject())
		{
			obj = vale.toObject();
		}		
		if (obj.contains("int"))
		{
			QJsonValue va = obj.value("int");
			if (va.isDouble())
			{
				int a = va.toInt();
			}
		}
	}

4.写xml文件

void Widget::WriteJson()
{
	if (QFile::exists("3.json"))
	{
		return;
	}
	//构建json对象
	QJsonObject obj;
	obj.insert("int", 1);
	obj.insert("bool", true);
	obj.insert("string", "str");
	//构建json文档
	QJsonDocument doc;
	doc.setObject(obj);
	QByteArray arry = doc.toJson();
	QFile file("3.json");
	file.open(QFile::ReadWrite);
	if (file.isOpen())
	{
		file.write(arry);
	}
}

如果以后工作中还需要在框架中用到json解析。既然wxJson并没有与版本一起更新,那可以从c++解析json入手找一款解析器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值