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. springboot项目获取resource下的文件

    package com.expr.exceldemo; import org.springframework.core.io.ClassPathResource; public class Test ...

  2. JVM相关文章和GC原理算法

    参考推荐: Java内存模型及GC原理 一个优秀的Java程序员必须了解的GC机制 Android 智能指针原理(推荐) Java虚拟机规范 Java虚拟机参数 Java内存模型 Java系列教程(推 ...

  3. Comparison and difference for Default geodatabase,Current workspace,Scratch workspace,Home Folder

    Comparison and difference for Default geodatabase,Current workspace,Scratch workspace,Home Folder 商务 ...

  4. ubuntu上保存防火墙规则

    与CentOS不同,ubuntu的iptables规则不是写在系统文件/etc/sysconfig/iptables 中的(至少1204 1404不是这样的) 保存: ubuntu的iptables建 ...

  5. vscode 常用设置与插件推荐

    1.Chinese (Simplified) Language Pack for Visual Studio Code 适用于 VS Code 的中文(简体)语言包 2.Color Info Visu ...

  6. [原][C++]拒绝智能指针与指针混用,常见智能指针问题

    公司一个非专科的程序在开发过程中有些毛躁,但是又想使用些新学的技术 这天他正调试呢,发现有一个BUG怎么也找不到原因. 用的好好的内存怎么就突然被删除了呢,好好的指针,怎么就访问越界了呢 没办法,他只 ...

  7. SemaphoreSlim 实现

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/dz45693/article/deta ...

  8. JDBC DataSource

    What is DataSource? 作为 DriverManager 设施的替代项,DataSource 对象是获取连接的首选方法.实现DataSource 接口的对象通常在基于 Java(TM) ...

  9. flutter 中的搜索条实现

    import 'package:flutter/material.dart'; import 'package:flutter_app/SearchBarDemo.dart'; void main() ...

  10. 从0开始学爬虫12之使用requests库基本认证

    从0开始学爬虫12之使用requests库基本认证 此处我们使用github的token进行简单测试验证 # coding=utf-8 import requests BASE_URL = " ...