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 = ; 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)的更多相关文章
- JSON - 使用cJSON 解析Qt通过UDP发送的JSON数据
1,cJSON支持在C程序中创建和解析JSON数据,其提供多种方法供C程序使用,最直接的是将cJSON.c和cJSON.h加入到C工程中,源代码:https://github.com/DaveGamb ...
- QT使用QJson生成解析Json数据的方法
QT中使用json还是比较方便的,下面用例子直接说明 举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示: 之后根据这个格式进行json数据解析. QT使用json需要包含的头文 ...
- Qt解析Json数据
1 JSON数据简介 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范) ...
- Qt QJson解析json数据
Qt QJson解析json数据 //加载根目录文件 void TeslaManageData::loadRootFolderFiles() { QNetworkAccessManager *mana ...
- QT json字符串生成和解析
1 QT json字符串生成和解析 1.1 QT Json解析流程 (1) 字符串转化为QJsonDocument QJsonParseError json_error; QJso ...
- andlua,andlua发送http请求,并解析json数据
andlua发送http请求,并解析json实例 import'cjson'import 'http'--导入cjson库url = 'https://www.baidu,com'--设置urlHtt ...
- 拿来即用:用C+JS结构来处理JSON数据
[面对的问题] 在物联网产品的开发过程中,对JSON格式的数据处理是一个强需求,例如亚马逊的 AWS IOT平台,设备与后台之间的通讯数据都是JSON格式,先瞄一眼大概的样子: 这是一个真实产品的通讯 ...
- 教你不编程快速解析 JSON 数据
JSON 是一种轻量级的,不受语言约束的数据存储格式,大部分编程语言都可以解析它,并且对编程人员也十分友好.我们在进行通讯/数据交互时,非常经常用到 JSON 格式. 但是,我们在进行数据存储的时候, ...
- C++实现对Json数据的友好处理
背景 C/C++客户端需要接收和发送JSON格式的数据到后端以实现通讯和数据交互.C++没有现成的处理JSON格式数据的接口,直接引用第三方库还是避免不了拆解拼接.考虑到此项目将会有大量JSON数据需 ...
随机推荐
- docker本地仓库&镜像
镜像的命名规则: 1.[冷数据]/[base镜像]例如:ansible,centos 2. lastest{最新的意思} 不是真的(随便命名) 3. [image name]=[repository ...
- CAT中实现异步请求的调用链查看
CAT简介 CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统.美团点评基础架构部希望在基础存储.高性能通信.大规模在线访 ...
- gdal
- 深入理解JS中&&和||
写了这么多JS,才发现JS的语法既是属于C语系的,又与一般C语系的编程语言某些地方有很大区别,其中&&和||就是其中一例. C语系中的&&和|| C语系的&&a ...
- Springboot配置文件获取系统环境变量的值
注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...
- Android平台云端打包证书使用说明
原贴:https://ask.dcloud.net.cn/article/35985 Android平台云端打包证书使用说明 分类:HBuilderX 证书 Android 签名证书是一个应用的所有者 ...
- linux非root用户安装4.0.14版本redis
先到官网https://redis.io/download下安装包,现在最新是5.0.5版本,可惜点击下载后被windows禁了,那就下4版本的,往下看Other versions的Old(4.0), ...
- 迅速解决!!!!!启动Tomcat报错PermGen space
启动Tomcat报错 PermGen space 内存溢出 解决方法:扩大tomcat内存 修改参数:set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSi ...
- 【Leetcode_easy】1029. Two City Scheduling
problem 1029. Two City Scheduling 参考 1. Leetcode_easy_1029. Two City Scheduling; 完
- CSS3 column 分栏
column的布局形式还没有使用过,后续的bug和解决方案有待检验. column column-count:number: 设置内容分为多少栏显示 column-width:长度单位:设置每一栏的 ...