Qt框架之解析和构建Json格式数据-程序员不得不懂的一种数据格式。

一、json格式简介

1、概念

JSON是一种轻量级的数据交换格式,采用key-value键值对的方式来存储数据,主要用于网络通讯传输、本地配置文件等,易于人阅读和编写。

2、json中的对象和数组

对象:采用大括号{},括起来,中间的以key-value的形式存储,形如{“name”:“ISmileLi”}。
数组:采用中括号[],括起来,中间的存储数据以逗号,分割开,形如[toby,ISmileLi]。

对象和数组之间可以相互嵌套使用。

二、Qt框架对json格式的主要支持类(以下说明根据官方文档翻译整理)

1、QJsonDocument类

QJsonDocument类提供了一种读写JSON文档的方法。
QJsonDocument是一个类,它包装一个完整的JSON文档,可以从UTF-8编码的基于文本的表示以及Qt自己的二进制格式读写该文档。
可以使用QJsonDocument::from JSON()将JSON文档,从基于文本的表示形式转换为QJsonDocument,使用toJson()将其转换回文本,解析器非常快速和高效,并将JSON转换为Qt使用的二进制表示。
可以使用isNull()查询解析文档的有效性!
可以使用isArray()和isObject()查询文档是否包含数组或对象。文档中包含的数组或对象可以使用array()或object()检索,然后读取或操作。
也可以使用fromBinaryData()或fromRawData()从存储的二进制表示创建文档。

2、QJsonObject类

QJsonObject类封装了一个JSON对象。
JSON对象是键-值对的列表,其中键是唯一的字符串,值由QJsonValue表示。
QJsonObject可以与QVariantMap进行转换。它提供了size、insert、remove等方法供使用并使用标准的C++迭代器模式迭代其内容。
QJsonObject是一个隐式共享的类,只要不修改它,它就与从中创建的文档共享数据。
可以通过QJsonDocument将对象转换为基于文本的JSON或者反向转换。

3、QJsonArray类

QJsonArray类封装了一个JSON数组。
JSON数组是一个值列表。可以通过从数组中插入和删除QJsonValue来操作列表。
QJsonArray可以与QVariantList进行转换。它提供了size、insert、remove等方法供使用,并使用标准的C++迭代器模式迭代其内容。
QJsonArray是一个隐式共享的类,只要不修改它,它就可以与QJsonDocument创建的文档共享数据。
可以通过QJsonDocument将数组转换为基于文本的JSON或者反向转换。

4、QJsonValue类

QJsonValue类用JSON封装一个值。
JSON是一种存储结构化数据的格式。它有6种基本数据类型:
布尔(Bool)、双精度(Double)、字符串(String)、数组(Array)、对象(Object)、空(Null)。
值可以表示上述任何数据类型。此外,QJsonValue还有一个特殊的标志来表示未定义的值,可以使用isUndefined()查询。
可以使用type()或访问器(如isBool()、isString()等)查询值的类型。同样,可以使用toBool()、toString()等将值转换为存储在其中的类型。
值在内部是严格类型化的,与QVariant相反,它不会尝试进行任何隐式类型转换。这意味着转换为不存储在值中的类型将返回默认的构造返回值

三、Json格式的构建与解析

1、构建和解析的数据格式如下:

{
    "ISmileLi": [{
        "info": {
            "id": "00000000",
            "sex": "就不告诉你",
            "age": "我还很年轻"
        },
        "location": {
            "city": "BeiJing",
            "country": "中国"
        },
        "profession": "programmer"
    }]
}

2、构建与解析示例代码:

#include <QtCore/QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>
#include <QDebug>

//QString jsonStr = "{
//"ISmileLi": [{
//	"info": {
//		"id": "00000000",
//			"sex" : "就不告诉你",
//			"age" : "我还很年轻"
//	},
//	"location" : {
//			"city": "BeiJing",
//			"country" : "中国"
//		},
//		"profession" : "programmer"
//}]
//}";

QByteArray g_personByte;

// json格式的生成,返回QString类型是为了方便测试
QString makeJsonData()
{
	QJsonObject personObject;
	QJsonArray personArray;

	QJsonObject infoKeyObject;
	QJsonObject infoValueObject;
	infoValueObject.insert("id", "2020");
	infoValueObject.insert("sex", QStringLiteral("就不告诉你"));
	infoValueObject.insert("age", QStringLiteral("我还很年轻"));
	infoKeyObject.insert("info", infoValueObject);

	QJsonObject locationKeyObject;
	QJsonObject locationValueObject;
	locationValueObject.insert("city", "BeiJing");
	locationValueObject.insert("country", "China");
	locationKeyObject.insert("location", locationValueObject);

	QJsonObject professionObject;
	professionObject.insert("profession", "programmer");
	
	personArray.insert(0, infoKeyObject);
	personArray.insert(1, locationKeyObject);
	personArray.insert(2, professionObject);

	personObject.insert("ISmileLI", personArray);

	if (personObject.isEmpty())
	{
		return "";
	}

	// 把json格式转化成QString返回
	QJsonDocument doc;
	doc.setObject(personObject);
	QByteArray personByte = doc.toJson(QJsonDocument::Compact);

	// 赋值给全局的,用于解析测试使用,实际开发中请勿这么干啊!
	g_personByte = personByte;

	QString personStr = QString::fromStdString(personByte.toStdString());
	return personStr;
}

// 解析json数据
bool analyseJsonData(QByteArray personByte)
{
	QJsonParseError parseError;
	QJsonDocument doc = QJsonDocument::fromJson(personByte,&parseError);
	if (parseError.error != QJsonParseError::NoError)
	{
		return false;
	}

	if (doc.isObject())
	{
		QJsonObject personObject = doc.object();
		if (personObject.contains("ISmileLI"))
		{ 
			
			QJsonArray personArray = personObject.value("ISmileLI").toArray();
			for (int i = 0; i < personArray.size(); i++)
			{
				QJsonObject infoObject = personArray.at(i).toObject();
				if (infoObject.contains("info"))
				{
					QJsonObject infoValueObject = infoObject.take("info").toObject();
					int id = infoValueObject.value("id").toInt();
					QString sexStr = infoValueObject.value("sex").toString();
					QString ageStr = infoValueObject.value("age").toString();
					qDebug() << "id: " << id << "  sex:" << sexStr << "  age:" << ageStr;
				}
				else if (infoObject.contains("location"))
				{
					QJsonObject locationObject = infoObject.take("location").toObject();
					QString cityStr = locationObject.value("city").toString();
					QString countryStr = locationObject.value("country").toString();
					qDebug() << "city: " << cityStr << "  country:" << countryStr;
				}
				else
				{
					QString professionStr = infoObject.take("profession").toString();
					qDebug() << "profession: " << professionStr;
				}
			}
		}
	}
	return true;
}

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

	// 构建json数据
	qDebug() << QStringLiteral("-------------------------构建json数据---------------------------");
	QString rootJsonStr = makeJsonData();
	qDebug() << rootJsonStr;
	qDebug() << QStringLiteral("-------------------------解析json数据---------------------------");
	analyseJsonData(g_personByte);

	return a.exec();
}

运行结果:
在这里插入图片描述

四、推荐一个在线的json格式验证工具

1、json在线验证:https://www.json.cn/

2、验证效果:

在这里插入图片描述
能力有限,如有错误,多多指教。。。。

发布了157 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/toby54king/article/details/104864593