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. Jmeter聚合报告理解

     Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 Samples:表示这次测试中一共发出了多少个请求 ...

  2. SyntaxError: Non-ASCII character 'æ' in file csdn.py on line 7, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

    错误信息: SyntaxError: Non-ASCII character , but no encoding declared; see http://python.org/dev/peps/pe ...

  3. Assignment6:白盒测试方法

    常用的软件测试方法有两大类:静态测试方法和动态测试方法. 其中软件的静态测试不要求在计算机上实际执行所测程序,主要以一些人工的模拟技术对软件进行分析和测试:而软件的动态测试是通过输入一组预先按照一定的 ...

  4. arcpy模块下的并行计算与大规模数据处理

    一个多星期的时间,忍着胃痛一直在做GIS 540: Spatial Programming的课程项目,导致其他方面均毫无进展,可惜可惜.在这个过程当中临时抱佛脚学习了很多Python相关的其他内容,并 ...

  5. 7年.NET面试Java的尴尬历程

    先简单介绍LZ 现如今的情况,LZ 1992年出生,2012年实习,大专学渣一枚,实习期直接被校企合作直招到公司做.NET开发,现如今在某三线城市做后端技术经理,7年开发经验(5年.Net,2年.NE ...

  6. CUDA编程之快速入门【转】

    https://www.cnblogs.com/skyfsm/p/9673960.html CUDA(Compute Unified Device Architecture)的中文全称为计算统一设备架 ...

  7. js 对象 toJSON 方法

    浅谈 js 对象 toJSON 方法   前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一 ...

  8. Win10 设备管理器一个USB设备描述符请求失败解决方法

    问题:进入设备管理器,发现[通用串行总线控制器]下有一项带有黄色[!]未知USB设备(设备描述符请求失败). 或者 解决方法如下: 1.点击Windows键 +R或者(点击系统桌面左下角[开始],在开 ...

  9. MySQL参数: innodb_flush_log_at_trx_commit和sync_binlog

    innodb_flush_log_at_trx_commit 当innodb_flush_log_at_trx_commit=0时, log buffer将每秒一次地写入log file, 并且log ...

  10. Typora的日常使用方法

    原文地址:https://www.jianshu.com/p/a6a6a22e9393 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易 ...