/*****************************************************************************************************
* 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. 大端和小端(big endian little endian)

    一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它 ...

  2. Graph_Master(连通分量_H_Trajan+拓扑序dp)

    Graph_Master_连通分量_H 题目描述: 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条 ...

  3. 【Semantic Segmentation】U-Net: Convolutional Networks for Biomedical Image Segmentation 论文解析(转)

    目录 0. 前言 1. 第一篇 2. 第二篇 3. 第三篇keras实现 4. 一篇关于U-Net的改进 0. 前言   今天读了U-Net觉得很不错,同时网上很多很好很详细的讲解,因此就不再自己写一 ...

  4. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  5. 实现表单checkbox获取已选择的值js代码

    <input type="checkbox" name="cb" value="1" />aa <input type=& ...

  6. php中点击下载按钮后待下载文件被清空

    在php中设置了文件下载,下载按钮使用表单的方式来提交 <form method="post" class="form-inline" role=&quo ...

  7. LA 7272 Promotions(dfs)

    https://vjudge.net/problem/UVALive-7272 题意: 公司要提拔人,现在有n个人,现在有m条有向边,A->B表示A的表现比B好,也就是如果B晋升了,那么A肯定会 ...

  8. Iterator 和 for...of 循环

    Iterator(遍历器)的概念 § ⇧ JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.这样就有了四种数据集合,用 ...

  9. DLL_Delphi动态调用

    1.动态调用DLL unit formMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...

  10. Docker 生态

    Docker 和容器技术的发展可谓是日新月异,本文试图以全局的视角来梳理一下 docker 目前的生态圈.既然是概览,所以不会涉及具体的技术细节. Docker 自从发布以来发生了很多的变化,并且有些 ...