概述
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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复