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 ...
随机推荐
- ubuntu16.04后续工作
一.ruijie https://blog.csdn.net/u012217085/article/details/24369335 https://blog.csdn.net/Lv_Victor/a ...
- 2017 ACM/ICPC Asia Regional Qingdao Online - 1008 Chinese Zodiac
2017-09-17 13:28:04 writer:pprp 签到题:1008 Chinese Zodiac #include <iostream> #include <strin ...
- 【Python】更优的字符串格式化方式 -- "format"替代"%s"
背景 前段时间看了一篇介绍Python的代码技巧的文章,建议格式化字符串时使用"format"代替使用"%",但是没有说明原因.各博客网站介绍相关用法的博客很多 ...
- 高质量的C++博客
陈硕 :http://blog.csdn.net/Solstice 孟岩: http://blog.csdn.net/myan
- linq 多条件join
var query=from a in db.A join b in db.B.Where(c=>c.num>3) on new {a.type ...
- VS2013 The Debugger Resource DLL is out of date
折磨了我一天的问题,亲们,记住,下载vs2013 update5 ,别的方法不用试了,完全没用!
- 1-13 RHEL7-硬盘介绍和磁盘管理
熟悉Linux平台下的存储介质,LVM逻辑卷.RAID 磁盘陈列等 大纲: 1-1 硬盘的分类及使用fdisk分区工具 1-1-1 认识硬盘的分类和特性.SCSI.IDE.SAS.SAT ...
- UVA-10054 The Necklace (欧拉回路)
题目大意:有n个珠子,珠子两边的颜色已知,问能否连成一条项链.(两个珠子可以项链当且仅当一个珠子的一边颜色与另一个珠子的另一边颜色相同). 题目分析:欧拉回路.将颜色视作节点,珠子当做边,问题变成了找 ...
- vue.js的安装部署+cnpm install 安装过程卡住不动----亲测可用
1.到Node.js的官网下载node node.js的下载地址,下载完成后,我在d盘新建一个文件夹“node”, 安装到node目录下(安装之后环境变量自动配置了,自己无需再配),比如我的安装路径是 ...
- settings.xml配置文件详解
简单值 一半顶层settings元素是简单值,它们表示的一系列值可以配置Maven的核心行为:settings.xml中的简单顶层元素 < settings xmlns="http:/ ...