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 = ; i < count; i++)
{
cJSON* pObject = cJSON_CreateObject();
cJSON_AddItemToArray(pData, pObject); QTreeWidgetItem* pTopItem = m_pPlanTree->topLevelItem(i);
QString text = pTopItem->text();
cJSON_AddItemToObject(pObject, "name", cJSON_CreateString(text.toStdString().c_str())); cJSON* pDataArray = cJSON_AddArrayToObject(pObject, "data"); int topChildCount = pTopItem->childCount();
for (int j = ; j < topChildCount; j++)
{
int childCount = pTopItem->child(j)->childCount();
for (int k = ; k < childCount; k++)
{
int childChildCount = pTopItem->child(j)->child(k)->childCount();
for (int n = ; n < childChildCount; n++)
{
QTreeWidgetItem* pChildChildItem = pTopItem->child(j)->child(k)->child(n);
QVariant var = pChildChildItem->data(, 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 = ; 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(, Qt::UserRole + , QVariant(TREE_ITEM_TYPE::TREE_PLAN_ROOT));
pRootPlanItem->setIcon(, 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 = ; i < dataSize; i++)
{
cJSON* item = cJSON_GetArrayItem(p_Data, i); VIDEO_DEVICE chData(item); //将视频监控按名称->地点->位置分类
if (pRootPlanItem->childCount() == ) {
createChildItem(pRootPlanItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_NAME);
createChildItem(pRootPlanItem->child(), chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR);
createChildItem(pRootPlanItem->child()->child(), chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL);
continue;
} for (int j = ; j < pRootPlanItem->childCount(); j++) //湖南省
{
QTreeWidgetItem* nameItem = pRootPlanItem->child(j);
if (chData.name == nameItem->text()) { if (nameItem->childCount() == ) {
createChildItem(nameItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR);
} for (int k = ; k < nameItem->childCount(); k++) //衡阳市
{
QTreeWidgetItem* addrItem = nameItem->child(k);
if (chData.addr == addrItem->text()) { for (int n = ; n < addrItem->childCount(); n++) //衡东县
{
QTreeWidgetItem* locationItem = addrItem->child(n);
if (chData.location == locationItem->text()) { //相同的预案则不重复添加
break;
}
else {
if (n < addrItem->childCount() - )
continue;
} //所有级都没有相同的则创建一个并保存返回
createChildItem(addrItem, chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL);
break;
}
break;
}
else {
if (k < nameItem->childCount() - )
continue;
}
createChildItem(nameItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR);
createChildItem(nameItem->child(k + ), chData, i, TREE_ITEM_TYPE::TREE_PLAN_CHANNEL);
break;
}
break;
}
else {
if (j < pRootPlanItem->childCount() - )
continue;
}
createChildItem(pRootPlanItem, chData, i, TREE_ITEM_TYPE::TREE_VIDEO_NAME);
createChildItem(pRootPlanItem->child(j + ), chData, i, TREE_ITEM_TYPE::TREE_VIDEO_ADDR);
createChildItem(pRootPlanItem->child(j + )->child(), 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(, QIcon(":/Images/Resources/video_icon.png"));
chItem->setToolTip(, 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(, Qt::UserRole, varChInfo);
} QVariant itemType(type);
chItem->setData(, Qt::UserRole + , 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)的更多相关文章

  1. JSON - 使用cJSON 解析Qt通过UDP发送的JSON数据

    1,cJSON支持在C程序中创建和解析JSON数据,其提供多种方法供C程序使用,最直接的是将cJSON.c和cJSON.h加入到C工程中,源代码:https://github.com/DaveGamb ...

  2. QT使用QJson生成解析Json数据的方法

    QT中使用json还是比较方便的,下面用例子直接说明 举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示: 之后根据这个格式进行json数据解析. QT使用json需要包含的头文 ...

  3. Qt解析Json数据

    1 JSON数据简介   JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范) ...

  4. Qt QJson解析json数据

    Qt QJson解析json数据 //加载根目录文件 void TeslaManageData::loadRootFolderFiles() { QNetworkAccessManager *mana ...

  5. QT json字符串生成和解析

    1         QT json字符串生成和解析 1.1  QT Json解析流程 (1)  字符串转化为QJsonDocument QJsonParseError json_error; QJso ...

  6. andlua,andlua发送http请求,并解析json数据

    andlua发送http请求,并解析json实例 import'cjson'import 'http'--导入cjson库url = 'https://www.baidu,com'--设置urlHtt ...

  7. 拿来即用:用C+JS结构来处理JSON数据

    [面对的问题] 在物联网产品的开发过程中,对JSON格式的数据处理是一个强需求,例如亚马逊的 AWS IOT平台,设备与后台之间的通讯数据都是JSON格式,先瞄一眼大概的样子: 这是一个真实产品的通讯 ...

  8. 教你不编程快速解析 JSON 数据

    JSON 是一种轻量级的,不受语言约束的数据存储格式,大部分编程语言都可以解析它,并且对编程人员也十分友好.我们在进行通讯/数据交互时,非常经常用到 JSON 格式. 但是,我们在进行数据存储的时候, ...

  9. C++实现对Json数据的友好处理

    背景 C/C++客户端需要接收和发送JSON格式的数据到后端以实现通讯和数据交互.C++没有现成的处理JSON格式数据的接口,直接引用第三方库还是避免不了拆解拼接.考虑到此项目将会有大量JSON数据需 ...

随机推荐

  1. listview1 保存和读取 listViewItems保存为txt

       /*          *   保存原理          *   将LISTVIEW视为一行一行的字符串          *   将所有的行合并成一个字符串 然后保存为TXT文件       ...

  2. IntelliJ IDEA配置Tomcat运行web项目

    小白一枚,借鉴了好多人的博客,然后自己总结了一些图,尽量的详细.在配置的过程中,有许多疑问.如果读者看到后能给我解答的,请留言.Idea请各位自己安装好,还需要安装Maven和Tomcat,各自配置好 ...

  3. Git是怎么Ignore文件的?

    Git is one of the most popular version control systems (VCS) available, especially thanks to hosting ...

  4. useReducer代替Redux小案例-2(八)

    通过上节课的学习,用useContext实现了Redux状态共享的能力,这节课看一下如何使用useReducer来实现业务逻辑的控制.需要注意的是这节课的内容是接着上节课的,需要你把上节课的代码部分完 ...

  5. PCA python 实现

    PCA 实现: 参考博客:https://blog.csdn.net/u013719780/article/details/78352262 from __future__ import print_ ...

  6. vim脚本判断操作系统

    Linux 和 Windows 通用配置 其实在配置文件中是可以通过逻辑代码判断平台做条件处理的,这样就可以实现一个配置文件两个个平台下共用了,判断逻辑如下: " ============= ...

  7. mac php7.2 安装mcrypt扩展

    安装: brew install libmcrypt 下载mcrypt扩展源码 http://pecl.php.net/package/mcrypt 解压后 进入目录: phpize ./config ...

  8. pytorch怎么使用定义好的模型的一部分

    Encoder代码为: .输入图片的通道nc=.ndf=. def __init__(self,isize,nz,nc,ndf,ngpu,n_exter_layers=,add_final_conv= ...

  9. Hive Essential (4):DML-project,filter,join,union

    1. Project data with SELECT The most common use case for Hive is to query data in Hadoop. To achieve ...

  10. SQL Delta实用案例介绍,很好的东西,帮了我不少忙

    SQL Delta实用案例介绍 概述 本篇文章主要介绍SQL DELTA的简单使用.为了能够更加明了的说明其功能,本文将通过实际项目中的案例加以介绍. 主要容 Ÿ   SQL DELTA 简介 Ÿ   ...