接上篇:Qt中的JSON操作_2: JSON在Qt中的使用,本篇主要讲利用Json在Qt中封装的类实现读写文件的举例。
我们在Qt中的JSON操作_1: JSON的基本知识介绍中举了一个Json对象的例子,对象1中嵌入对象2,对象2中嵌入数组,对其进行读写操作。
1.将Json格式文件写入磁盘文件(序列化)
(1)代码:
#include "mainwindow.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>
#include <QFile>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QJsonDocument doc;
if(doc.isEmpty())
{
qDebug()<<"json document is empty...";
}
if(doc.isNull())
{
qDebug()<<"json document is null...";
}
writeJson();
}
MainWindow::~MainWindow()
{
}
/*
{
"Name":"Ace",
"Sex":"man",
"Age":20,
"Family":{
"Father":"Gol·D·Roger",
"Mother":"Portgas·D·Rouge",
"Brother":["Sabo", "Monkey D. Luffy"]
},
"IsAlive":false,
"Comment":"yyds"
}
*/
//Json对象内数据的写入,转换为Json文档对象
void MainWindow::writeJson()
{
//上面的内容整体是在一个Json的对象中,因此先创建一个空Json对象
QJsonObject obj;
//在空Json对象中需要添加若干个键值对,使用inser方法
//QJsonObject::iterator insert(const QString &key, const QJsonValue &value)
//insert方法中第二个参数是QJsonValue "Ace"是一个字符串,由于QJsonValue中的构造函数有一个的参数是字符串类型
//输入"Ace"之后就会自动调用参数是字符串的构造函数,对字符串进行构造,最终得到QJsonValue的对象,这种操作叫做隐式类型转换
obj.insert("Name","Ace");
obj.insert("Sex","man");
obj.insert("Age",20);
//由于内嵌的为一个子对象,因此需要重新构造一个子对象
QJsonObject subObj;
subObj.insert("Father","Gol·D·Roger");
subObj.insert("Mother","Portgas·D·Rouge");
//对于brother,其value是一个数组,需要创建一个数组
QJsonArray array;
array.append("Sabo");
array.append("Monkey D. Luffy");
subObj.insert("Brother",array);
//插入子对象
obj.insert("Family",subObj);
obj.insert("IsAlive",false);
obj.insert("Comment","yyds");
//Json对象转换为Json文档对象
QJsonDocument doc(obj);
//将Json文档对象转换为字符串类型
QByteArray json=doc.toJson();
//构造QFile对象,关联一个磁盘文件
QFile file("D:\\ace.json");
//通过QFile对象打开关联的磁盘文件,打开方式为只写,返回值为一个Bool变量
file.open(QFile::WriteOnly);
//将字符串写入磁盘文件中
file.write(json);
file.close();
}
void MainWindow::readJson()
{
}
(2)运行结果
- 程序中的
QJsonDocument doc;为空对象,因此运行后报出为空
json document is empty...
json document is null...
(1)代码:
#include "mainwindow.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>
#include <QFile>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QJsonDocument doc;
if(doc.isEmpty())
{
qDebug()<<"json document is empty...";
}
if(doc.isNull())
{
qDebug()<<"json document is null...";
}
writeJson();
readJson();
}
MainWindow::~MainWindow()
{
}
/*
{
"Name":"Ace",
"Sex":"man",
"Age":20,
"Family":{
"Father":"Gol·D·Roger",
"Mother":"Portgas·D·Rouge",
"Brother":["Sabo", "Monkey D. Luffy"]
},
"IsAlive":false,
"Comment":"yyds"
}
*/
//Json对象内数据的写入,转换为Json文档对象
void MainWindow::writeJson()
{
//上面的内容整体是在一个Json的对象中,因此先创建一个空Json对象
QJsonObject obj;
//在空Json对象中需要添加若干个键值对,使用inser方法
//QJsonObject::iterator insert(const QString &key, const QJsonValue &value)
//insert方法中第二个参数是QJsonValue "Ace"是一个字符串,由于QJsonValue中的构造函数有一个的参数是字符串类型
//输入"Ace"之后就会自动调用参数是字符串的构造函数,对字符串进行构造,最终得到QJsonValue的对象,这种操作叫做隐式类型转换
obj.insert("Name","Ace");
obj.insert("Sex","man");
obj.insert("Age",20);
//由于内嵌的为一个子对象,因此需要重新构造一个子对象
QJsonObject subObj;
subObj.insert("Father","Gol·D·Roger");
subObj.insert("Mother","Portgas·D·Rouge");
//对于brother,其value是一个数组,需要创建一个数组
QJsonArray array;
array.append("Sabo");
array.append("Monkey D. Luffy");
subObj.insert("Brother",array);
//插入子对象
obj.insert("Family",subObj);
obj.insert("IsAlive",false);
obj.insert("Comment","yyds");
//Json对象转换为Json文档对象
QJsonDocument doc(obj);
//将Json文档对象转换为字符串类型
QByteArray json=doc.toJson();
//构造QFile对象,关联一个磁盘文件
QFile file("D:\\ace.json");
//通过QFile对象打开关联的磁盘文件,打开方式为只写,返回值为一个Bool变量
file.open(QFile::WriteOnly);
//将字符串写入磁盘文件中
file.write(json);
file.close();
}
void MainWindow::readJson()
{
//构造QFile对象,关联一个磁盘文件
QFile file("D:\\ace.json");
//通过QFile对象打开关联的磁盘文件,打开方式为只读,返回值为一个Bool变量
file.open(QFile::ReadOnly);
//将磁盘文件内容读入到字符串中
QByteArray all=file.readAll();
file.close();
//读出的字符串转换为Json的文档对象
QJsonDocument doc=QJsonDocument::fromJson(all);
//判断读入的是读入的是对象还是数组,如果是对象就将对象读出来
//大多数是不用判断的
if(doc.isObject())
{
QJsonObject obj=doc.object();
//Json对象中包含了很多键值对,需要按照键对出对应的Value
//首先将Key值读入到一个List中
QStringList keys=obj.keys();
//对QStringList容器所有的Key值进行遍历
for(int i=0;i<keys.size();++i)
{
//取出Key
QString key=keys.at(i);
//根据Key得到对应的Value值
QJsonValue value=obj.value(key);
//得到的Value可能是各种数据类型,进行判断,并打印出来
if(value.isBool())
{
qDebug()<<key<<":"<<value.toBool();
}
else if(value.isString())
{
qDebug()<<key<<":"<<value.toString();
}
else if(value.isDouble())
{
//实际使用的是int型的
qDebug()<<key<<":"<<value.toInt();
}
//Json格式的文件汇总包含一个子对象,因此还需要对其内部进行解析
else if(value.isObject())
{
qDebug()<<key<<":"<<value.toObject();
//得到一个子对象
QJsonObject subObj=value.toObject();
//获取所有的key的列表
QStringList subkeys=subObj.keys();
//进行遍历
for(int k=0;k<subkeys.size();++k)
{
QJsonValue subValue=subObj.value(subkeys.at(k));
if(subValue.isString())
{
qDebug()<<" "<<subkeys.at(k)<<":"<<value.toString();
}
else if(subValue.isArray())
{
QJsonArray array=subValue.toArray();
for(int j=0;j<array.size();++j)
{
qDebug()<<" "<<array[j].toString();
}
}
}
}
}
}
}
(2)运行结果
qDebug输出,内容并不一定完全对,但思路是没有问题的
json document is empty...
json document is null...
"Age" : 20
"Comment" : "yyds"
"Family" : QJsonObject({"Brother":["Sabo","Monkey D. Luffy"],"Father":"Gol??D??Roger","Mother":"Portgas??D??Rouge"})
"Sabo"
"Monkey D. Luffy"
"Father" : ""
"Mother" : ""
"IsAlive" : false
"Name" : "Ace"
"Sex" : "man"
一般情况下,对于 Json 字符串的解析函数都是有针对性的,因为需求不同设计的 Json 格式就会有所不同,所以不要试图写出一个通用的 Json 解析函数,这样只会使函数变得臃肿而且不易于维护,每个 Json 格式对应一个相应的解析函数即可。
上面的例子中为了给大家演示 Qt 中 Json 类相关 API 函数的使用将解析步骤写的复杂了,因为在解析的时候我们是知道 Json 对象中的所有 key 值的,可以直接通过 key 值将对应的 value 值取出来,因此上面程序中的一些判断和循环其实是可以省去的。
声明: 本篇是在以下视频及链接基础上学习并稍微做了补充,感谢原博主!
学习视频地址:Json简介学习视频
学习笔记网址:笔记网址