Qt中 使用Json 对自定义对象进行序列与反序列化 之一

没有使用多态的情况比较简单,完整代码如下:

#include <QCoreApplication>

#include <memory>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

class Data
{
public:
    Data(void){}
    Data(const std::wstring &name) : dataName(name){}
    virtual ~Data() {}

    std::wstring getName(void){
        return dataName;
    }

    virtual void write(QJsonObject &json){
        json["Name"] = QString::fromStdWString(dataName.c_str());

    }
    virtual void read(const QJsonObject &json){
        dataName = json["Name"].toString().toStdWString();
    }

    virtual void print(std::wostream &out){
        out << dataName.c_str() << std::endl;
    }

private:
    std::wstring dataName;
};

class DataAnalog : public Data
{
public:
    DataAnalog(void){}
    DataAnalog(const std::wstring &name, const double value):Data(name), dataValue(value) {}
    virtual ~DataAnalog(){}

    virtual void write(QJsonObject &json) override{
        Data::write(json);
        json["Value"] = dataValue;
    }
    virtual void read(const QJsonObject &json) override{
        Data::read(json);
        dataValue = json["Value"].toDouble();
    }

    virtual void print(std::wostream &out){
        out << getName().c_str() << L"=" << dataValue << std::endl;
    }

private:
    double dataValue = 0;
};

class DataDigital : public Data
{
public:
    DataDigital(void) {}
    DataDigital(const std::wstring &name, const bool value):Data(name), dataValue(value){}
    virtual ~DataDigital(){}

    virtual void write(QJsonObject &json) override{
        Data::write(json);
        json["Value"] = dataValue;
    }
    virtual void read(const QJsonObject &json) override{
        Data::read(json);
        dataValue = json["Value"].toBool();
    }

    virtual void print(std::wostream &out) override{
        out << getName().c_str() << L"=" << (dataValue?L"true":L"false") << std::endl;
    }

private:
    bool dataValue = false;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    {//保存
        std::vector<std::shared_ptr<Data>> analogs;
        analogs.emplace_back(new DataAnalog(L"Anlog_1", 1.1));
        analogs.emplace_back(new DataAnalog(L"Anlog_2", 2.2));
        std::vector<std::shared_ptr<Data>> digitals;
        digitals.emplace_back(new DataDigital(L"Digita_1", true));
        digitals.emplace_back(new DataDigital(L"Digita_2", false));

        QFile file(QCoreApplication::applicationDirPath() + "\\data.json");
        if(file.open(QFile::WriteOnly))
        {
            QJsonArray analogArray;
            for(auto data:analogs)
            {
                QJsonObject obj;
                data->write(obj);
                analogArray.append(obj);
            }

            QJsonArray digitalArray;
            for(auto data:digitals)
            {
                QJsonObject obj;
                data->write(obj);
                digitalArray.append(obj);
            }

            QJsonObject json;
            json["Analogs"] = analogArray;
            json["Digitals"] = digitalArray;
            QJsonDocument doc(json);
            file.write(doc.toJson());
        }
    }

    {//加载
        QFile file(QCoreApplication::applicationDirPath() + "\\data.json");
        if(file.open(QFile::ReadOnly))
        {
            QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
            if(!doc.isNull())
            {
                QJsonObject json = doc.object();
                std::vector<std::shared_ptr<Data>> analogs;
                QJsonArray analogArray = json["Analogs"].toArray();
                for(auto i : analogArray)
                {
                    analogs.emplace_back(new DataAnalog());
                    analogs.back()->read(i.toObject());
                }

                std::vector<std::shared_ptr<Data>> digitals;
                QJsonArray digitalArray = json["Digitals"].toArray();
                for(auto i : digitalArray)
                {
                    digitals.emplace_back(new DataDigital());
                    digitals.back()->read((*i).toObject());
                }

                std::for_each(analogs.begin(), analogs.end()
                              , [](std::shared_ptr<Data> data){data->print(std::wcout);});
                std::for_each(digitals.begin(), digitals.end()
                              , [](std::shared_ptr<Data> data){data->print(std::wcout);});
            }
        }
    }

    return a.exec();
}
时间: 2024-10-10 15:10:18

Qt中 使用Json 对自定义对象进行序列与反序列化 之一的相关文章

Qt中 使用Json 对自定义对象进行序列与反序列化 之二

在使用多态的情况下,通过基类的指针列表序列化时,需保存对象的类型信息.在反序列化时通过类型信息构造正确的子类对象.代码中类型信息使用C++ typeid获取,以保证可移植性. 全部代码如下: #include <QCoreApplication> #include <memory> #include <vector> #include <string> #include <iostream> #include <algorithm>

JS中的如何构造自定义对象

一.对象是什么及组成及使用方法: 1.对象是种特殊的数据结构,结合了数据与依据数据行动的程序代码. 2.实际上,对象只是结合成单一结构体的变量和函数. 3.当变量被放在对象中时,它称为特性:当函数被放在对象中时,它被称为方法. 4.引用特性和方法时需提供对象的名称,后随点号运算符,再接上特性或方法的名称. 二.构造函数负责创建对象: 既然对象具有相关的数据,数据便需在对象创建时初始化,此时需要一个特殊的方法——构造函数(constructor),来为对象准备运行.每个对象都需要自己的构造函数,其

Android 中的Json解析工具fastjson 、序列化、反序列化

Android中通常需要访问服务器,然而服务器返回的数据很多时候都是Json格式 1.fastjson简介 阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:    速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser.包括自称最快的JackJson: 功能强大,完全支持JavaBean.集合.Map.日期.Enum,支持范型,支持自省:无依赖,能够直接运行在Java SE 5.0以上版本:支持And

Qt中容器类应该如何存储对象

Qt提供了丰富的容器类型,如:QList.QVector.QMap等等.详细的使用方法可以参考官方文档,网上也有很多示例文章,不过大部分文章的举例都是使用基础类型:如int.QString等.如果我们要存储一个对象类型,应该如何做呢?—— 当然是和int类型一样操作,因为这些容器类都是泛型的.不过,我们今天要讨论的不是容器类的使用用法,而是容器存储的对象内存如何释放的问题. (这里提到了对象类型是指 Class/Struct,可以继承自QObject,也可以是普通的C++类.) 下面以QList

com.alibaba.fastjson.JSON对类对象的序列化与反序列化

1. 目标 把类的对象存储到字符串可存储 2. 类定义 public interface JsonInterface { } mport com.alibaba.fastjson.JSON; import lombok.Getter; import lombok.Setter; @Setter @Getter public class JsonVo implements JsonInterface { private String id; private String name; public

C# Json数据与对象的序列化与反序列化

先在NuGet包管理器中获取以下包: 在cs文件中引入命名空间: 1 using Newtonsoft.Json; 方法的实现: 1 public static string ObjectToJson(this object data) 2 { 3 return JsonConvert.SerializeObject(data); 4 } 5 6 public static T JsonToObject<T>(this string data) 7 { 8 return JsonConvert

含有日期类型对象的序列化合反序列化

protected void Page_Load(object sender, EventArgs e) { Person p = new Person(); p.Name = "张三"; p.Age = 28; p.LastLoginTime = DateTime.Now; string jsonString = JsonSerializer<Person>(p); } public class Person { public string Name { get; set

《java入门第一季》之HashSet存储自定义对象问题以及注意事项

上一篇http://blog.csdn.net/qq_32059827/article/details/51578158 写到存储字符串类型的时候出现了无序,而且这个无序不是随机那种无序,它是有一定存储规律的.上次存储的是字符串,那么这里看看存储自定义对象是不是也是同样的规律.其实这里有着很多的问题需要讨论. 存储自定义对象,代码写了出来: import java.util.HashSet; public class HashSetDemo2 { public static void main(

iOS 自定义对象及子类及模型套模型的拷贝、归档存储的通用代码

一.runtime实现通用copy 如果自定义类的子类,模型套模型你真的会copy吗,小心有坑. copy需要自定义类继承NSCopying协议 #import <objc/runtime.h> - (id)copyWithZone:(NSZone *)zone { id obj = [[[self class] allocWithZone:zone] init]; Class class = [self class]; while (class != [NSObject class]) {