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

/*****************************************************************************************************
 *                       Qt jsoncpp 对象拷贝、删除、函数调用 demo
 * 声明:
 *     本程序主要就是为了验证jsoncpp中Json::Value对象中的append、等号赋值是拷贝内容,还是赋值指针,
 * 就测试而言,从目前的情况来看应该是拷贝内容,在下面checkAndRemoveAppName()得到了验证。
 *
 *                                              2015-11-15 晴 深圳 南山平山村  曾剑锋
 ****************************************************************************************************/

#include <QCoreApplication>
#include "json/json.h"
#include <QString>
#include <QFile>
#include <QDebug>

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);

    }

    Json::Value newApps;
    newApps["apps"]         = newPrograms;
    (*newRoot)["main_menu"] = newApps;

    return ret;
}

#define jsonFile "F:\/QT\/json.txt"

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 outRoot;
    checkAndRemoveAppName(&root, &outRoot, "Information");

    // 生成写入文件的字符串
    Json::StyledWriter writer;
    std::string outputJsonstring = writer.write(outRoot);
    std::cout << outputJsonstring << std::endl;

    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"
  *          }
  *     ]
  * }
  */
时间: 2024-08-05 07:07:11

Qt jsoncpp 对象拷贝、删除、函数调用 demo的相关文章

网页中的内容拷贝到EXCEL之后,有些对象无法删除

大家经常会遇到从某个系统的web页面上Copy内容到Excel中,之后,会发现有一些对象,像多选框,单选框无法删除. 看A1 位置的单选框 选中之后点delete也无法删除,很是急人啊. 不过,想要删除它也非常简单, 首先,点击ctrl+G 打开定位对话框,然后定位所有的对象,点击special  然后选择objects 这样,就选中了所有的对象.然后直接点delete就可以了 网页中的内容拷贝到EXCEL之后,有些对象无法删除

Qt学习之QListWidget删除Item

将QListWidgetItem从QListWidget列表中删除有两种方法可以做到,但也要根据自己的需要进行选择. 第一种是 QListWidgetItem *takeItem(int row); 使用此方法需要知道删除的是第几个Item,并且返回删除的Item指针. 第二种是 inline void removeItemWidget(QListWidgetItem *item); 需要知道删除的Item的对象. 代码测试:先添加5个Item,然后删除第三个(索引为2,从0开始),再使用第二种

类似QQ消息左滑删除的Demo

最近在网上学到一篇类似QQ消息左滑删除的demo,完善了下代码,感觉还不错,特此分享一波: CustomSwipeListView.java 是个继承自ListView的类,里面调用了自定义View 类SwipeItemView.java的一个收缩的方法.其实QQ消息删除这个动画可以有很多种方法实现,这里我们介绍的方法是:常规ListView的每个Item展示方式不变,只是在Adapter类里面去绑定该显示的数据和删除等字样.具体详见如下: 自定义的ListView: package com.r

Qt元对象系统源码解析

Qt元对象系统源码解析 https://blog.51cto.com/9291927/2070348 一.Qt元对象系统简介 1.元对象系统简介 Qt 的信号槽和属性系统基于在运行时进行内省的能力,所谓内省是指面向对象语言的一种在运行期间查询对象信息的能力, 比如如果语言具有运行期间检查对象型别的能力,那么是型别内省(type intropection)的,型别内省可以用来实施多态.C++的内省比较有限,仅支持型别内省, C++的型别内省是通过运行时类型识别(RTTI)(Run-Time Typ

Qt持久性对象进行序列化(同时比较了MFC与Java的方法)

Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的类必须实现java.io.Serializable或Externalizable接口完成.Qt是怎么搞定这个事情那,QDataStream类:让我们不禁想起Mfc中的CAchive类.Java中的java.io.ObjectOutputStream/ObjectInputStream类,分别提供了对

Java 开发中的对象拷贝

前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提供的属性拷贝 在 Spring 中直接调用 BeanUtils.copyProperties();即可. 它的核心通过循环 target 的所有方法名,然后在 source 中找到对应的方法名,最后通过反射从 source 中获取并写入 target 中. Spring 没有通过 java.lang

Qt持久性对象进行序列化

Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的类必须实现java.io.Serializable或Externalizable接口完成.Qt是怎么搞定这个事情那,QDataStream类:让我们不禁想起Mfc中的CAchive类.Java中的java.io.ObjectOutputStream/ObjectInputStream类,分别提供了对

python中的对象拷贝

python中无论参数传递还是函数返回值,都是进行引用传递.那如何拷贝对象呢,标准库的copy模块提供了两个方法:copy和deepcopy方法. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 见下例: import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 e = a[:] #利用分片操作进行拷贝(浅拷贝) b = a <span style="white-

跟王老师学反射(九):反射应用小案例--进行对象拷贝

跟王老师学反射(九):反射应用小案例--进行对象拷贝 学习内容 一.需求 二.参考代码 (一)Customer:标准JavaBean (二)方法编写 来自为知笔记(Wiz)