开发者社区> zengjf> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Qt jsoncpp 对象拷贝、删除、函数调用 demo

简介: /***************************************************************************************************** * Qt jsoncpp 对象拷贝、删除、函数调用 demo * 声明: * 本程序主要就是为了验证jsoncpp中Json::Value对象中的append、等号赋值是拷贝内容,还是赋值指针, * 就测试而言,从目前的情况来看应该是拷贝内容,代码得以验证。
+关注继续查看
/*****************************************************************************************************
 *                       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"]               = 999;
    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"]    = -1;
    item["Lock"]                = -1;

    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 = 0;
    for ( i = 0; i < programs.size(); i++ ) {

        // 如果有name对应的app,那么就对app进行更新
        if ( QString::fromStdString(programs[i]["Name"].asString()).trimmed().compare(name.trimmed()) == 0 ) {
            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 = 0;
    for ( i = 0; i < programs.size(); i++ ) {

        if ( QString::fromStdString(programs[i]["Name"].asString()).trimmed().compare(name.trimmed()) == 0 ) {
            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 -1;
    }

    // 打开并读取文件
    QString jsonString;
    if ( jsonFileObject.open(QIODevice::ReadOnly | QIODevice::Text) ) {
        jsonString.append(jsonFileObject.readAll());
        jsonFileObject.close();
    } else {
        qDebug() << "Open json file failt." << endl;
        return -1;
    }

    // 解析json数据
    Json::Value root;
    Json::Reader reader;
    bool parsingSuccessful = reader.parse(jsonString.toStdString(), root);
    if ( !parsingSuccessful ) {
        qDebug() << "Failed to parse configure.\n ";
        return -1;
    }

    // 测试获取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 -1;
    }

    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"
  *          }
  *     ]
  * }
  */

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
71 0
种群进化+邻域搜索的混合算法(GA+TS)求解作业车间调度问题(JSP)-算法介绍
种群进化+邻域搜索的混合算法(GA+TS)求解作业车间调度问题(JSP)-算法介绍
110 0
零基础入门Serverless:Todo List应用创建(体验函数计算抽盲盒,1500等领)
今年天猫双十一,阿里云Serverless支撑业务场景更多,范围更广。越来越多企业和开发者正在尝试使用Serverless,而Serverless开发者工具无疑是加速Serverless快速落地的利器。 这一次,我们基于阿里云函数计算+Serverless开发者工具Serverless Devs打造场景,让你用“一行代码” 极速进入Serverless的世界。
159 0
《网站建设与网页设计从入门到精通Dreamweaver+Flash+Photoshop+HTML+CSS+JavaScript》——3.2 创建站点
本节书摘来自异步社区《网站建设与网页设计从入门到精通Dreamweaver+Flash+Photoshop+HTML+CSS+JavaScript》一书中的第3章,第3.2节,作者:何新起 更多章节内容可以访问云栖社区“异步社区”公众号查看。
1967 0
Qt 4.8.5 jsoncpp lib
Qt 4.8.5 jsoncpp lib 一、参考文档: 1. QtCreator动态编译jsoncpp完美支持x86和arm平台 http://www.
981 0
Ubuntu下JDK7安装全过程并调试第一个带包的java程序
第一步:下载jdk-7-linux-i586.tar.gz 第二步:解压安装 cd /usr/libsudo mkdir jvm cd {你的目录jdk压缩文件目录} sudo tar zxvf jdk-7-linux-i586.
644 0
《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之47---BREW SDK 九大功能之显示和用户界面
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
584 0
《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之49---BREW SDK 九大功能之多媒体系统
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
648 0
+关注
633
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载