Qt框架之解析和构建Json格式数据-程序员不得不懂的一种数据格式。
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、验证效果:
能力有限,如有错误,多多指教。。。。