/*****************************************************************************************************
* 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的更多相关文章

  1. C++ //拷贝构造函数调用时机//1.使用一个已经创建完毕的对象来初始化一个新对象 //2.值传递的方式给函数参数传值 //3.值方式返回局部对象

    1 //拷贝构造函数调用时机 2 3 4 #include <iostream> 5 using namespace std; 6 7 //1.使用一个已经创建完毕的对象来初始化一个新对象 ...

  2. python中的对象拷贝

    python中.进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递.假设是列表或字典则是引用传递.那python怎样对列表和字典进行拷贝传递呢:标准库的copy模块提供了两个方法:copy和d ...

  3. 返璞归真 asp.net mvc (1) - 添加、查询、更新和删除的 Demo

    原文:返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo [索引页] [源码下载] 返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo 作者 ...

  4. 【转】python中的对象拷贝

    转自:https://www.cnblogs.com/bhlsheji/p/5352330.html python中.进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递.假设是列表或字典则是引 ...

  5. 类似QQ消息左滑删除的Demo

    最近在网上学到一篇类似QQ消息左滑删除的demo,完善了下代码,感觉还不错,特此分享一波: CustomSwipeListView.java 是个继承自ListView的类,里面调用了自定义View ...

  6. Qt学习之QListWidget删除Item

    将QListWidgetItem从QListWidget列表中删除有两种方法能够做到.但也要依据自己的须要进行选择. 第一种是 QListWidgetItem *takeItem(int row); ...

  7. Python比较操作符、变量赋值、对象拷贝

    Python比较操作符.变量赋值.对象拷贝 目录 Python比较操作符.变量赋值.对象拷贝 1. 比较操作符 == 和 is 1.1 区别 1.2 实例 2. 变量及其赋值 2.1 概念和逻辑关系 ...

  8. Qt持久性对象进行序列化

    Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的 ...

  9. 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表

    (先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...

随机推荐

  1. Css常用属性单位

    长度单位:px-像素 颜色单位:         ①十六进制:#FFFFFF:         ②颜色名称:red:         ③RGB颜色代码:RGB(0-255,0-255,0-255): ...

  2. RabbitMQ入门(2)——工作队列

    前面介绍了队列接收和发送消息,这篇将学习如何创建一个工作队列来处理在多个消费者之间分配耗时的任务.工作队列(work queue),又称任务队列(task queue). 工作队列的目的是为了避免立刻 ...

  3. 2018 ICPC北京 H ac自动机

    n=40的01串,求有多少m=40的01串中包含它,包含的定义是存在子串有至多一个字符不相同 600组n=15的数据 15组n=40的数据,所以我们只能支持n^5的算法. 陷入两个比较有意思的坑: 1 ...

  4. ZeroMq实现跨线程通信

    ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...

  5. phalcon: 解决php7/phalcon3.2以上版本,不支持oracle数据库的方法

    解决php7/phalcon3.2以上版本,不支持oracle数据库的方法 phalcon3.2(3.0以上)版本不支持oracle的方法. https://github.com/phalcon/in ...

  6. JS检查数组中是否存在某个值

    //三个参数,在array中查找needle,bool为布尔量,如果为true则返回needle在array中的位置function inArray2(needle,array,bool){      ...

  7. MFC sendmessage实现进程间通信

    用sendmessage实现进程间通信. 1.WM_COPYDATA实现进程间通信 实现方式是发送WM_COPYDATA消息. 发送程序: LRESULT copyDataResult; //copy ...

  8. @Primary-在spring中常被忽视的注解

    在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的.但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary  ...

  9. Project facet Java version 1.8 is not supported.

    Eclipse中添加项目到Servers中时提示“Project facet Java version 1.8 is not supported.” 解决方案:方法一:选中项目,右键roperties ...

  10. js排序算法04——归并排序

    归并排序是一种分治算法.思想是把原数组切分成较小的数组,直到每个小数组只有一个位置,再将小数组归并成较大的数组,直到最后有一个完整有序的大数组. js实现如下: function mergeSort( ...