我是靠谱客的博主 高大西装,最近开发中收集的这篇文章主要介绍序列化与反序列化小栗子(json),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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,也希望能得到大佬指点。

最后

以上就是高大西装为你收集整理的序列化与反序列化小栗子(json)的全部内容,希望文章能够帮你解决序列化与反序列化小栗子(json)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部