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数据需 ...
随机推荐
- !!a标签和button按钮只允许点击一次,防止重复提交
button 方法:加上属性disabled = “disabled” 或者 disabled = “true” <button id="btn" disabled=&quo ...
- 帮谷歌推广Webp图片格式之:Webp的格式转换
参考谷歌官网:Webp: A new image format for the Web Webp是Google强推的新一代网络图片格式,特点就是:高质量压缩.能压缩多少呢?5MB的原图,不降低效果,转 ...
- 方法重载与invokevirtual字节码指令的关系
1.方法重载 创建MyTest5类 public class MyTest5 { public void test(Grandpa grandpa){ System.out.println(" ...
- nginx配置静态资源与动态访问分离【转】
在前面的博客中<说说 NGINX 的配置及优化>的 2.5 小节里面,提到 location 模块是 nginx 中用的最多的,也是最重要的模块,负载均衡.反向代理.虚拟域名等都与它相关. ...
- vue子组件数据变化同步到父组件中
方法:通过watch监听子组件数据变化 1.父组件中注册方法 <Child @getChildValue="getChildValue"></Child> ...
- ISO/IEC 9899:2011 条款6.5.9——相等操作符
6.5.9 相等操作符 语法 1.equality-expression: relational-expression equality-expression == relational- ...
- 内存检测工具valgrind的安装和简单使用
1. 安装 .tar.bz2 cd valgrind- sudo ./configure sudo make sudo make install 2. 简单使用 #include <stdio. ...
- 深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智 ...
- Spring MVC 为控制器添加通知与处理异常
与Spring AOP一样,Spring MVC也能够给控制器加入通知,它主要涉及4个注解: •@ControllerAdvice,主要作用于类,用以标识全局性的控制器的拦截器,它将应用于对应的控制器 ...
- git 更新fork的远程仓库
1.添加远程仓库到本地remote分支 git remote add upstream git@github.com:apache/flink.git # 远程仓库地址 2.查看当前仓库的远程分支 g ...