Qt之JSON生成与解析

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;
                            }
                        }
                    }
                }
            }

        }
    }

}

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值