QT json數據的應用(cJSON)


 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM