Qt中的JSON操作_3: JSON在Qt中的应用举例(写入和读出的关键是利用QJsonDocument实现Json格式的文件转换为字符串)

接上篇: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...
  • 在生成的.json文件中,对于键值是按照升序的方式进行排序的,结果如下:
    在这里插入图片描述

    2.将Json文件从磁盘读出(Json格式字符串反序列化)


    反序列化即从Json格式字符串中得到原始数据的过程,其过程就是利用 QJsonDocument类将字符串 --> QJsonObject 或者 QJsonArray,再利用QJsonObject 或者 QJsonArray的方法取出相应值。

(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简介学习视频
学习笔记网址:笔记网址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十月旧城

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

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

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

打赏作者

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

抵扣说明:

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

余额充值