序列化与反序列化小栗子(json)

7 篇文章 7 订阅

json是一种文本格式,它来自javaScript。一般用作数据交换(如前后端),或保存程序运行状态。这也是序列化和反序列化的意义。

于josn序列化,我并不能完全体会到它的真正作用,我接触的还太少太少,这里只是展示一个小小的例子。一方面希望记录自己尝试时的思想,一方面希望看到的大佬能给讲解一下它在实际项目中的具体妙用。
这几天在看Qt的东西,提起应用程序就不得不去面对一个很现实的问题,就是:程序运行状态的保存。最简单的例子就是:退出前保存数据,再次打开时再把数据读回来。
现这种功能不仅是只有json,除去json以外,还有好多种方法,不过json算是较为简单的一种。
上图:
==这是随便写的,不要在意细节==
问题:如何在退出程序的时候,将用户的信息保存起来了,并在下一次打开的时候再将它们加载回来?
这里用json和struct去实现。

首先进行保存
把数据存到结构体中,、
定义一个简单的结构体:

struct studentInfo
{
    QString name;
    int age;
    QString subject;
};

义一个获取界面信息的函数,然后把数据放入结构体中:

 studentInfo Widget::getStudentInfo()
 {
     studentInfo stInfo;
     stInfo.name = nameLineEdit->text();
     stInfo.subject = subjectLineEdit->text();
     stInfo.age = sp->value();
     return stInfo;
 }
 studentInfo sInfo = getStudentInfo();

照结构体中的数据,构建json对象。把结构体中数据保存到json对象。简单来说就是结构体中有什么我们构建json的时候就写什么:

    //构建结构体json对象
    QJsonObject stinfoJson;
    //按结构体的样子打扮json
    stinfoJson.insert("name",sInfo.name);   
    stinfoJson.insert("subject",sInfo.subject);
    stinfoJson.insert("age",sInfo.age);

json对象构建起来后,就是再构建一个json文档,因为我们最终是想把界面的数据存成json格式的文档。

    QJsonDocument infoJsonDocument;
    infoJsonDocument.setObject(stinfoJson);

时的json文档内已经是经过struct数据->json对象->json文档,将界面信息保存下来了,但还没有形成文本文件。
接下来就是将json文档保存为txt文本保存起来:

    QFile jsonData("json.txt");
    if(jsonData.open(QFile::ReadWrite|QFile::Truncate))
    {
	jsonData.write(infoJsonDocument.toJson(QJsonDocument::Compact));
        jsonData.close();
    }

名字取为json.txt。
过保存按钮调用操作系统文件保存对话框将文档保存起来:

在这里插入图片描述
开后我们能看到界面数据按照json格式保存的文档内容。
在这里插入图片描述

现在清空界面关闭程序再读回来
在这里插入图片描述
回来就是一个解析json文档的过程,方法很简单,就是一步一步判断json文档中的数据,得到内容项的匹配后,将它放回到界面对应的位置。

    //文档是否非空
    if(!infoJsonDocument.isNull())
    {
        //是否为json格式的文档
        if(infoJsonDocument.isObject())
        {
            QJsonObject object = infoJsonDocument.object();
            //是否包含age键
            if(object.contains("age"))
            {
                QJsonValue value = object.value("age");
                if(value.isDouble())
                {
                    double age = value.toDouble();
                    sp->setValue(age);
                }
            }
            //是否包含name键
            if(object.contains("name"))
            {
                QJsonValue value =object.value("name");
                if(value.isString())
                {
                    QString nameStr = value.toString();
                    nameLineEdit->setText(nameStr);
                }
            }
            //是否包含subject键
            if(object.contains("subject"))
            {
                QJsonValue value = object.value("subject");
                if(value.isString())
                {
                    QString subjectStr = value.toString();
                    subjectLineEdit->setText(subjectStr);
                }
            }
        }

然,这是直接解析json文档,实际上在解析它之前我们得先去把json.txt读回来并转成json文档,再开始上面得解析过程
如下:

    //调用操作系统加载文档的对话框
    QString str1 = QFileDialog::getOpenFileName(this,tr("加载json文档"),"json(.txt)");
    QFile file;
    file.setFileName(str1);
    //使用Qt中的QFile去打开我们的json.txt文档
    file.open(QIODevice::ReadOnly);
    //将文档保存成字节数组
    QByteArray ba = file.readAll(); //从设备(QFile对象打开的json.txt文本)读取所有剩余数据,并将其作为字节数组返回。
    //字节数组转成json文档
foJsonDocument = QJsonDocument::fromJson(ba);

是一个简单的序列化和反序列化的小例子,但作为一个菜鸟,也是刚刚接触IT领域,并不能深刻体会josn序列化反序列化的实际用意,我会继续去了解json,也希望能得到大佬指点。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆的菜菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值