首页 > Web开发 > 详细

QT json数据的应用(cJSON)

时间:2019-12-17 14:07:24      阅读:218      评论:0      收藏:0      [点我收藏+]

 

json数据可保存小量的数据在本地的json文件中。QT有两种方式操作:(1).cJSON (2).QT的操作json数据的类。

 

应用:将监控预案数据保存在本地中。

技术分享图片

 

1.首先根据预案结构创建一个json格式的数据框架:

技术分享图片

 

 

2.将监控预案树转化成json数据,再保存为json文件。

void VideoPreview::setPlanTreeDataToJsonFile()
{
    //将m_pPlanTree预案数据转化成json数据写入文件
    cJSON* pData = cJSON_CreateArray();

    int count = m_pPlanTree->topLevelItemCount();
    for (int i = 0; i < count; i++)
    {
        cJSON* pObject = cJSON_CreateObject();
        cJSON_AddItemToArray(pData, pObject);

        QTreeWidgetItem* pTopItem = m_pPlanTree->topLevelItem(i);
        QString text = pTopItem->text(0);
        cJSON_AddItemToObject(pObject, "name", cJSON_CreateString(text.toStdString().c_str()));

        cJSON* pDataArray = cJSON_AddArrayToObject(pObject, "data");

        int topChildCount = pTopItem->childCount();
        for (int j = 0; j < topChildCount; j++)
        {
            int childCount = pTopItem->child(j)->childCount();
            for (int k = 0; k < childCount; k++)
            {
                int childChildCount = pTopItem->child(j)->child(k)->childCount();
                for (int n = 0; n < childChildCount; n++)
                {
                    QTreeWidgetItem* pChildChildItem = pTopItem->child(j)->child(k)->child(n);
                    QVariant var = pChildChildItem->data(0, Qt::UserRole);
                    VIDEO_CHANNEL vc = var.value<VIDEO_CHANNEL>();
                    VIDEO_DEVICE chData = vc.device;

                    cJSON* pObj = chData.covertToJson();
                    cJSON_AddItemToArray(pDataArray, pObj);
                }
            }
        }
    }

    //写入到文件(覆盖)
    writePreviePlan(pData);
}
void VideoPreview::writePreviePlan(cJSON * data)
{
    QString filePath = QApplication::applicationDirPath() + "/previewPlanConfig.json";
    QFile file(filePath);
    bool bRet = file.open(QIODevice::WriteOnly | QIODevice::Text);
    if (bRet) {
        file.write(cJSON_PrintUnformatted(data));
    }
}

 

 

3.当监控预案树初始化时:

void VideoPreview::reloadPreviePlan()   //重新从json文件中加载预案数据到m_pPlanTree
{
    m_pPlanTree->clear();
    cJSON* pData = readPreviewPlan();
    QString str = cJSON_Print(pData);
    
    if (pData) {
        int size = cJSON_GetArraySize(pData);

        for (int i = 0; i < size; i++) {
            cJSON* pArray = cJSON_GetArrayItem(pData, i);
            cJSON* pName = cJSON_GetObjectItem(pArray, "name");   //预案名称
            QString planName = cJSON_Print(pName);
            planName = planName.replace("\"", "");


            //添加顶层节点
            QTreeWidgetItem* pRootPlanItem = new QTreeWidgetItem(m_pPlanTree, QStringList() << planName);
            pRootPlanItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);   //设置可编辑
            pRootPlanItem->setData(0, Qt::UserRole + 1, QVariant(TREE_ITEM_TYPE::TREE_PLAN_ROOT));
            pRootPlanItem->setIcon(0, QIcon(":/Images/Resources/video_plan.png"));

            m_pPlanTree->addTopLevelItem(pRootPlanItem);   //添加顶层节点


            //在根节点下添加数据
            cJSON* p_Data = cJSON_GetObjectItem(pArray, "data");   //数据
            int dataSize = cJSON_GetArraySize(p_Data);
            for (int i = 0; i < dataSize; i++)
            {
                cJSON* item = cJSON_GetArrayItem(p_Data, i);

                VIDEO_DEVICE chData(item);

                //将视频监控按名称->地点->位置分类
                if (pRootPlanItem->childCount() == 0) {
                    createChildItem(pRootPlanItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_NAME);
                    createChildItem(pRootPlanItem->child(0), chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR);
                    createChildItem(pRootPlanItem->child(0)->child(0), chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL);
                    continue;
                }

                for (int j = 0; j < pRootPlanItem->childCount(); j++)   //湖南省
                {
                    QTreeWidgetItem* nameItem = pRootPlanItem->child(j);
                    if (chData.name == nameItem->text(0)) {

                        if (nameItem->childCount() == 0) {
                            createChildItem(nameItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR);
                        }

                        for (int k = 0; k < nameItem->childCount(); k++)   //衡阳市
                        {
                            QTreeWidgetItem* addrItem = nameItem->child(k);
                            if (chData.addr == addrItem->text(0)) {

                                for (int n = 0; n < addrItem->childCount(); n++)   //衡东县
                                {
                                    QTreeWidgetItem* locationItem = addrItem->child(n);
                                    if (chData.location == locationItem->text(0)) {

                                        //相同的预案则不重复添加
                                        break;
                                    }
                                    else {
                                        if (n < addrItem->childCount() - 1)
                                            continue;
                                    }

                                    //所有级都没有相同的则创建一个并保存返回
                                    createChildItem(addrItem, chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL);
                                    break;
                                }
                                break;
                            }
                            else {
                                if (k < nameItem->childCount() - 1)
                                    continue;
                            }
                            createChildItem(nameItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR);
                            createChildItem(nameItem->child(k + 1), chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL);
                            break;
                        }
                        break;
                    }
                    else {
                        if (j < pRootPlanItem->childCount() - 1)
                            continue;
                    }
                    createChildItem(pRootPlanItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_NAME);
                    createChildItem(pRootPlanItem->child(j + 1), chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR);
                    createChildItem(pRootPlanItem->child(j + 1)->child(0), chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL);
                    break;
                }
            }
        }
    }
}

void VideoPreview::createChildItem(QTreeWidgetItem *parent, VIDEO_DEVICE data, int channel, TREE_ITEM_TYPE type)
{
    QString text;
    if (type == TREE_ITEM_TYPE::TREE_VIDEO_NAME) {
        text = data.name;
    }
    else if (type == TREE_ITEM_TYPE::TREE_VIDEO_ADDR) {
        text = data.addr;
    }
    else if (type == TREE_ITEM_TYPE::TREE_VIDEO_CHANNEL || type == TREE_ITEM_TYPE::TREE_PLAN_CHANNEL) {
        text = data.location;
    }

    QTreeWidgetItem* chItem = new QTreeWidgetItem(parent, QStringList() << QString(text));
    chItem->setIcon(0, QIcon(":/Images/Resources/video_icon.png"));
    chItem->setToolTip(0, data.name + "-" + data.addr + "-" + data.location);

    if (type == TREE_ITEM_TYPE::TREE_VIDEO_CHANNEL || type == TREE_ITEM_TYPE::TREE_PLAN_CHANNEL) {
        VIDEO_CHANNEL chInfo;
        chInfo.device.copyFrom(data);
        chInfo.nChannel = channel;
        QVariant varChInfo;
        varChInfo.setValue(chInfo);
        chItem->setData(0, Qt::UserRole, varChInfo);
    }

    QVariant itemType(type);
    chItem->setData(0, Qt::UserRole + 1, itemType);
}

 

cJSON* VideoPreview::readPreviewPlan()
{
    cJSON* pRet = NULL;
    QString filePath = QApplication::applicationDirPath() + "/previewPlanConfig.json";
    QFile file(filePath);
    bool bRet = file.open(QIODevice::ReadWrite | QIODevice::Text);
    if (bRet) {
    
        QByteArray ar = file.readAll();
        pRet = cJSON_Parse(ar.toStdString().c_str());
        file.close();
    }
    return pRet;
}

QT json数据的应用(cJSON)

原文:https://www.cnblogs.com/tingtaishou/p/12053555.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!