Qt jsoncpp 对象拷贝、删除、函数调用 demo
/*****************************************************************************************************
* Qt jsoncpp 对象拷贝、删除、函数调用 demo
* 声明:
* 本程序主要就是为了验证jsoncpp中Json::Value对象中的append、等号赋值是拷贝内容,还是赋值指针,
* 就测试而言,从目前的情况来看应该是拷贝内容,代码得以验证。
*
* 2015-11-15 晴 深圳 南山平山村 曾剑锋
****************************************************************************************************/ /**
* 参考文档:
* 1. JsonCpp ambiguous overload only in Windows
* http://stackoverflow.com/questions/18901781/jsoncpp-ambiguous-overload-only-in-windows
* 2. QT 使用jsoncpp
* http://www.cnblogs.com/foxhengxing/archive/2011/12/02/2272020.html
* 3. Using JsonCpp and Qt Together (Problems with Unicode)
* http://stackoverflow.com/questions/4191528/using-jsoncpp-and-qt-together-problems-with-unicode
* 4. ambiguous overload for 'operator[]'
* http://www.gamedev.net/topic/618752-ambiguous-overload-for-operator/
* 5. 一个C++编译错误
* http://blog.chinaunix.net/uid-7865778-id-2038882.html
*/ #include <QCoreApplication>
#include "json/json.h"
#include <QString>
#include <QFile>
#include <QDebug> #define ICON_PATH "apps\/images\/"
#define SHELL_PATH "\/usr\/share\/web\/lighttpd\/webpages\/shell\/"
#define JSON_FILE "F:\/QT\/json.txt" void jsonUpdateApp(Json::Value *programs, int index, QString icon, QString exec) { // 名字相同了,自然不需要再重新赋值了
//(*programs)[index]["Name"] = name.toStdString();
(*programs)[index]["Icon"] = QString(ICON_PATH).append(icon).toStdString();
(*programs)[index]["Exec"] = QString(SHELL_PATH) .append(exec).append(".sh").toStdString(); } void jsonAddApp(Json::Value *programs, QString name, QString icon, QString exec) { // 合成新的数据并加入json对象中
Json::Value item;
item["Name"] = name.toStdString();
item["Order"] = ;
item["Icon"] = QString(ICON_PATH).append(icon).toStdString();
item["Type"] = "application";
item["Exec"] = QString(SHELL_PATH).append(exec).append(".sh").toStdString();
item["ProgramType"] = "gui";
item["Description_Link"] = -;
item["Lock"] = -; programs->append(item); } void copyItem(Json::Value *programs, Json::Value *newPrograms, int index) { // 合成新的数据并加入json对象中
Json::Value newItem;
newItem["Name"] = (*programs)[index]["Name"];
newItem["Order"] = (*programs)[index]["Order"];
newItem["Icon"] = (*programs)[index]["Icon"];
newItem["Type"] = (*programs)[index]["Type"];
newItem["Exec"] = (*programs)[index]["Exec"];
newItem["ProgramType"] = (*programs)[index]["ProgramType"];
newItem["Description_Link"] = (*programs)[index]["Description_Link"];
newItem["Lock"] = (*programs)[index]["Lock"]; newPrograms->append(newItem); } bool checkAndAddUpdateAppByName(Json::Value *oldRoot, Json::Value *newRoot, QString name,
QString icon, QString exec) { bool ret = false;
Json::Value programs = ((*oldRoot)["main_menu"])["apps"];
Json::Value newPrograms; int i = ;
for ( i = ; i < programs.size(); i++ ) { // 如果有name对应的app,那么就对app进行更新
if ( QString::fromStdString(programs[i]["Name"].asString()).trimmed().compare(name.trimmed()) == ) {
jsonUpdateApp(&programs, i, icon, exec);
ret = true;
} copyItem(&programs, &newPrograms, i);
} // 如果name没有重复的,那么添加一个这个app
if ( i >= programs.size() )
jsonAddApp(&newPrograms, name, icon, exec); Json::Value newApps;
newApps["apps"] = newPrograms;
(*newRoot)["main_menu"] = newApps; return ret;
} bool checkAndRemoveAppName(Json::Value *oldRoot, Json::Value *newRoot, QString name) { bool ret = false;
Json::Value programs = ((*oldRoot)["main_menu"])["apps"];
Json::Value newPrograms; int i = ;
for ( i = ; i < programs.size(); i++ ) { if ( QString::fromStdString(programs[i]["Name"].asString()).trimmed().compare(name.trimmed()) == ) {
ret = true;
continue;
} /*
* // 合成新的数据并加入json对象中
* Json::Value newItem;
* newItem["Name"] = programs[i]["Name"];
* newItem["Order"] = programs[i]["Order"];
* newItem["Icon"] = programs[i]["Icon"];
* newItem["Type"] = programs[i]["Type"];
* newItem["Exec"] = programs[i]["Exec"];
* newItem["ProgramType"] = programs[i]["ProgramType"];
* newItem["Description_Link"] = programs[i]["Description_Link"];
* newItem["Lock"] = programs[i]["Lock"];
*
* newPrograms.append(newItem);
*
* 下面这个函数是从上面的代码中重构出来的
*/
copyItem(&programs, &newPrograms, i);
} Json::Value newApps;
newApps["apps"] = newPrograms;
(*newRoot)["main_menu"] = newApps; return ret;
} int main(int argc, char *argv[])
{ QCoreApplication a(argc, argv); // 检查文件是否存在
QFile jsonFileObject("F:/QT/json.txt");
if ( !jsonFileObject.exists() ) {
qDebug() << "Please check json.txt file already exist." << endl;
return -;
} // 打开并读取文件
QString jsonString;
if ( jsonFileObject.open(QIODevice::ReadOnly | QIODevice::Text) ) {
jsonString.append(jsonFileObject.readAll());
jsonFileObject.close();
} else {
qDebug() << "Open json file failt." << endl;
return -;
} // 解析json数据
Json::Value root;
Json::Reader reader;
bool parsingSuccessful = reader.parse(jsonString.toStdString(), root);
if ( !parsingSuccessful ) {
qDebug() << "Failed to parse configure.\n ";
return -;
} // 测试获取json数据
Json::Value programs = root["main_menu"]["apps"];
qDebug() << "programs size: " << programs.size();
// 这里的获取数据数据索引后面一定要加一个小写的u,目前还不知道具体的原因
std::cout << "Exec: " << programs[0u]["Exec"].asString() << std::endl; Json::Value outRootWithRemove;
checkAndRemoveAppName(&root, &outRootWithRemove, "Network");
Json::Value outRootWithRemoveAndAdd;
checkAndAddUpdateAppByName(&outRootWithRemove, &outRootWithRemoveAndAdd, "zengjf", "zengjf", "zengjf"); // 生成写入文件的字符串
Json::StyledWriter writer;
std::string outputJsonstring = writer.write(outRootWithRemoveAndAdd); // 将输出字符串输出到console上查看效果
std::cout << outputJsonstring << std::endl; // 如果仅仅是测试,不需要写入文件,省的每次还要去换json.txt文件
if ( jsonFileObject.open(QIODevice::WriteOnly | QIODevice::Text) ) {
jsonFileObject.write(outputJsonstring.data());
jsonFileObject.close();
} else {
qDebug() << "Open json file failt." << endl;
return -;
} return a.exec();
} /**
* json.txt
* {
* "main_menu" : {
* "apps" : [
* {
* "Description_Link" : -1,
* "Exec" : "/usr/share/web/lighttpd/webpages/shell/browser.sh http://processors.wiki.ti.com",
* "Icon" : "apps/images/web-icon.png",
* "Lock" : -1,
* "Name" : "Browser",
* "Order" : 999,
* "ProgramType" : "gui",
* "Type" : "application"
* },
* {
* "Description_Link" : -1,
* "Exec" : "/usr/share/web/lighttpd/webpages/shell/network.sh",
* "Icon" : "apps/images/network-icon.png",
* "Lock" : -1,
* "Name" : "Network",
* "Order" : 999,
* "ProgramType" : "gui",
* "Type" : "application"
* }
* ]
* }
*/ /**
* 输出结果:
* json.txt
* {
* "main_menu" : {
* "apps" : [
* {
* "Description_Link" : -1,
* "Exec" : "/usr/share/web/lighttpd/webpages/shell/browser.sh http://processors.wiki.ti.com",
* "Icon" : "apps/images/web-icon.png",
* "Lock" : -1,
* "Name" : "Browser",
* "Order" : 999,
* "ProgramType" : "gui",
* "Type" : "application"
* },
* {
* "Description_Link" : -1,
* "Exec" : "/usr/share/web/lighttpd/webpages/shell/zengjf.sh",
* "Icon" : "apps/images/zengjf",
* "Lock" : -1,
* "Name" : "zengjf",
* "Order" : 999,
* "ProgramType" : "gui",
* "Type" : "application"
* }
* ]
* }
*/
Qt jsoncpp 对象拷贝、删除、函数调用 demo的更多相关文章
- C++ //拷贝构造函数调用时机//1.使用一个已经创建完毕的对象来初始化一个新对象 //2.值传递的方式给函数参数传值 //3.值方式返回局部对象
1 //拷贝构造函数调用时机 2 3 4 #include <iostream> 5 using namespace std; 6 7 //1.使用一个已经创建完毕的对象来初始化一个新对象 ...
- python中的对象拷贝
python中.进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递.假设是列表或字典则是引用传递.那python怎样对列表和字典进行拷贝传递呢:标准库的copy模块提供了两个方法:copy和d ...
- 返璞归真 asp.net mvc (1) - 添加、查询、更新和删除的 Demo
原文:返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo [索引页] [源码下载] 返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo 作者 ...
- 【转】python中的对象拷贝
转自:https://www.cnblogs.com/bhlsheji/p/5352330.html python中.进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递.假设是列表或字典则是引 ...
- 类似QQ消息左滑删除的Demo
最近在网上学到一篇类似QQ消息左滑删除的demo,完善了下代码,感觉还不错,特此分享一波: CustomSwipeListView.java 是个继承自ListView的类,里面调用了自定义View ...
- Qt学习之QListWidget删除Item
将QListWidgetItem从QListWidget列表中删除有两种方法能够做到.但也要依据自己的须要进行选择. 第一种是 QListWidgetItem *takeItem(int row); ...
- Python比较操作符、变量赋值、对象拷贝
Python比较操作符.变量赋值.对象拷贝 目录 Python比较操作符.变量赋值.对象拷贝 1. 比较操作符 == 和 is 1.1 区别 1.2 实例 2. 变量及其赋值 2.1 概念和逻辑关系 ...
- Qt持久性对象进行序列化
Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的 ...
- 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表
(先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...
随机推荐
- redis:Invalid input of type: 'bool' type. Convert to a byte,string or number first
分析:出现此错误的原因是redis版本过高导致的,因此降低redis版本即可 解决: pip install -U redis==2.10.6
- shell脚本中使用什么工具进行计算
1.答: expr 2. expr的用法: jello=$(expr 1 \* 3) //乘法,注意1和expr之间有空格,1与转换符\之间有空格,3和*之间有空格 jello=$(expr 1 / ...
- jackson序列化字段字母大小写及字段名重复
一:Jackson默认的属性发现规则将会查找到如下所述的属性: 1.所有被public修饰的字段(成员变量): 2.所有被public修饰的getter(即形如“getXxx()”的方法): 3.所有 ...
- heatbeat-gui实现基于nfs的mysql高可用集群
一.简述HA高可用集群 高可用集群就是当集群中的一个节点发生各种软硬件及人为故障时,集群中的其他节点能够自动接管故障节点的资源并向外提供服务.以实现减少业务中断时间,为用户提供更可靠,更高效的服务. ...
- linux ssh认证(公钥机)配置
一.产生背景 在实际工作中,linux集群需要自动化的管理,市面上较常见的自动化运维工具诸如ansible,puppet,saltstack:轻量级的有pssh系列,这其中大多数工具使用的前提就是集群 ...
- Elasticsearch之停用词
前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch的停用词 1.有些词在文本中出现的频率非常高,但是对文本所携带 ...
- class文件直接修改_反编译修改class文件变量
今天笔者同事遇到一个问题,客户同事的数据库连接信息直接写在代码中,连接的密码改了,但是又没有源代码,所以只能直接修改Java class文件. 记录一下修改步骤: 1.下载JClassLib_wind ...
- cordova安卓sdk
Android SDK在线更新镜像服务器来下载安装: 1.北京化工大学镜像服务器地址: IPv4: ubuntu.buct.edu.cn/ 端口:80 IPv4: ubuntu.buct.cn/ 端口 ...
- 二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存
注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 # -*- coding: utf-8 -*- # Define your ite ...
- phpMyAdmin 应用程序“DEFAULT WEB SITE”中的服务器错误
分析原因:没有“C:\inetpub\wwwroot\phpmyadmin\”此目录 解决办法:新建路径 分析原因:IIS设置少了一项,需添加"服务端包含"选项 解决办法:控制面板 ...