JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它是基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。JSON是完全独立于语言的文本格式,在C、C++、C#、Java、JavaScript、Perl、Python等语言中都可以使用。由于JSON跨语言且易于人阅读和编写,同时也易于机器解析和生成。因此Json数据格式在网络通信中经常用到,尤其是http交互,里面的数据封装都是json格式,常见的Json解析库有
JsonCpp
JsonCpp是一个C++用来处理JSON数据的开发包。
网址:http://jsoncpp.sourceforge.net/.
cJSON
cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。
网址:http://sourceforge.net/projects/cjson/.
QJson
QJson是一个基于Qt的开发包用来将JSON数据解析成QVariant对象,JSON的数组将被映射为QVariantList实例,而其他对象映射为QVariantMap实例。
本文介绍关于Qt对Json的生成与解析操作,下面看具体代码实现
//Json数据封装
//json数据
//{
// "os_type": "windows",
// "os_ver": 10,
// "timestamp": 1604038799753,
// "data": {
// "account": 823697,
// "sign": "7ff50349eb98577f8bcf8f4ed1",
// "token": "e293619154b246a8bb4819edc01cff6b1604038809166"
// },
// "log": [{"extra": {"errorCode": 4933},"name": "camel", "time": "2014-01-10 15:44:49"},
// {"extra": {"errorCode": 4947},"name": "mark", "time": "2014-01-10 15:44:50"}]
//}
void MainWindow::slotCreateJson()
{
//构建data数据
QJsonObject dataObject;
dataObject.insert("account", 823697);
dataObject.insert("sign", "7ff50349eb98577f8bcf8f4ed1");
dataObject.insert("token", "e293619154b246a8bb4819edc01cff6b1604038809166");
//构建log数据
//1.创建errorCode对象
QJsonObject errorCodeObj1;
errorCodeObj1.insert("errorCode", 4933);
QJsonObject errorCodeObj2;
errorCodeObj2.insert("errorCode", 4947);
//2.创建数组中的对象
QJsonObject arrayValueObj1;
arrayValueObj1.insert("extra", errorCodeObj1);
arrayValueObj1.insert("name", "camel");
arrayValueObj1.insert("time", "2014-01-10 12:36:12");
QJsonObject arrayValueObj2;
arrayValueObj2.insert("extra", errorCodeObj2);
arrayValueObj2.insert("name", "mark");
arrayValueObj2.insert("time", "2014-01-10 15:44:49");
//3.创建数组对象
QJsonArray arrayObj;
arrayObj.append(arrayValueObj1);
arrayObj.append(arrayValueObj2);
//4.创建要Json对象
m_jsonObj.insert("os_type", "windows");
m_jsonObj.insert("os_ver", 10);
m_jsonObj.insert("timestamp", 1604038799753);
m_jsonObj.insert("data", dataObject);
m_jsonObj.insert("log", arrayObj);
QByteArray byteArray = QJsonDocument(m_jsonObj).toJson(QJsonDocument::Compact);
qDebug() << "byteArray=========" << byteArray;
}
//Json数据解析
void MainWindow::slotAnalysisJson()
{
QByteArray byteArray = QJsonDocument(m_jsonObj).toJson(QJsonDocument::Compact);
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError); // 转化为 JSON 文档
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))// 解析未发生错误
{
if (doucment.isObject()) // JSON 文档为对象
{
QJsonObject object = doucment.object(); // 转化为对象 第一级
if (object.contains("os_type"))
{
//方式1:
QString strType = object["os_type"].toString();
qDebug() << "os_type: " << strType;
//方式2:
QJsonValue value = object.value("os_type");
if (value.isString()) {
QString strType2 = value.toString();
qDebug() << "os_type: " << strType2;
}
}
if (object.contains("os_ver"))
{
int nVer = object["os_ver"].toInt();
qDebug() << "os_ver: " << nVer;
}
if (object.contains("timestamp"))
{
double dTime = object["timestamp"].toDouble();
qint64 nTime = static_cast<qint64>(dTime);
qDebug() << "timestamp: " << nTime;
}
//Json子对象
if (object.contains("data"))
{
QJsonValue value = object.value("data");
if (value.isObject()) // data 的 value 是对象
{
QJsonObject dataObj = value.toObject();
if (dataObj.contains("account"))
{
int nVer = dataObj["account"].toInt();
qDebug() << "account: " << nVer;
}
if (dataObj.contains("sign"))
{
QString strSign = dataObj["sign"].toString();
qDebug() << "sign: " << strSign;
}
if (dataObj.contains("token"))
{
QString strToken = dataObj["token"].toString();
qDebug() << "token: " << strToken;
}
}
}
//数组对象
if (object.contains("log"))
{
QJsonValue value = object.value("log");
if (value.isArray()) // log 的 value 是数组
{
QJsonArray array = value.toArray();
int nSize = array.size();//数组元素个数
for (int i = 0; i < nSize; ++i)
{
QJsonValue value = array.at(i);
if (value.isObject())
{
QJsonObject logObj = value.toObject();
if (logObj.contains("extra"))//extra字段
{
QJsonObject extraObj = logObj["extra"].toObject();
if(extraObj.contains("errorCode"))//errorCode字段
{
int nCode = extraObj["errorCode"].toInt();
qDebug() << "errorCode: " << nCode;
}
}
if (logObj.contains("name"))//name字段
{
QString strName = logObj["name"].toString();
qDebug() << "name: " << strName;
}
if (logObj.contains("time"))//time字段
{
QString strTime = logObj["time"].toString();
qDebug() << "strTime: " << strTime;
}
}
}
}
}
}
}
}