QT(9)-Qjson移植

1.导入QJSON库

QJson已经在QT5中集成到了QtCore模块中,在使用QJson时不需要额外引入其它模块。

C++常用的Json库:JsonCppCJSONQJson

地址:QJson (sourceforge.net)

QJsonArray:json数组类,类似QVariantList

QJsonObject:json对象类,类似QVariantMap

QJsonDocument:json文档类,主要将用于转换json与ByteArray格式数据

2.数据写入

2.1 QJsonObject

复制代码
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QJsonObject>
#include <QDateTime>
#include <QJsonDocument>
#include <QJsonArray>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    // 在home路径创建test.json文件,以读写方式打开
    QFile file(QDir::homePath() + "/jsonObject.json");
    if( !file.open(QIODevice::ReadWrite) )
    {
        qDebug() << "file open error!";
        return 1;
    }
 
    // 使用QJsonObject对象插入键值对。(写入文件中与代码中,不能保证成员顺序一致。实际是保存到了QVariantMap中)
    QJsonObject jsonObject;
    jsonObject.insert("name","tom");
    jsonObject.insert("age",18.5);
    jsonObject.insert("time",QDateTime::currentDateTime().toString());
 
    // 创建Json文档对象,将Json对象设置到文档对象中,写入到文件时使用文档的        QJsonDocument::toJson()方法,将Json数据转换为字节数组
    QJsonDocument jsonDoc;
    jsonDoc.setObject(jsonObject);
 
    file.write(jsonDoc.toJson());
    file.close();
 
    qDebug() << "write to file done.";
    return a.exec();
}

jsonObject.json文件内容:

复制代码
{
    "age": 18.5,
    "name": "tom",
    "time": "Fri Jul 9 10:30:34 2021"
}

2.2 QJsonArray

复制代码
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QJsonObject>
#include <QDateTime>
#include <QJsonDocument>
#include <QJsonArray>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
   QFile fileArray(QDir::homePath() + "/jsonArray.json");
   if( !fileArray.open(QIODevice::ReadWrite))
   {
       qDebug() << "file open error!";
       return 1;
   }
   // 使用JsonArray添加值并写入文件(写入文件中的与代码中的顺序一致,实际是保存到了QVariantList中)
   QJsonArray jsonArray;
   jsonArray.append("name");
   jsonArray.append(18);
   jsonArray.append(QDateTime::currentDateTime().toString());
 
   QJsonDocument jsonArrayDoc;
   jsonArrayDoc.setArray(jsonArray);
 
   fileArray.write(jsonArrayDoc.toJson());
   fileArray.close();
 
   qDebug() << "write jsonArray to file done.";
   return a.exec();
}

jsonArray.json文件内容

复制代码
[
    "name",
    18,
    "Fri Jul 9 10:30:34 2021"
]

2.3 JsonObject与JsonArray结合使用例子

复制代码
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QDebug>
#include <QJsonObject>
#include <QDateTime>
#include <QJsonDocument>
#include <QJsonArray>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    QFile fileExample(QDir::homePath() + "/JsonExample.json");
    if( !fileExample.open(QIODevice::ReadWrite))
    {
        qDebug() << "JsonExample file open error!";
        return 1;
    }
    QJsonArray exampleArray;
    int baseAge = 20;
 
    char* names[] = {"tom" , "bob", "lili"};
 
    // 将每个对象放入json数组中
    for(int i = 0; i < 3; ++i)
    {
        QJsonObject exampleObject;
 
        exampleObject.insert("name",names[i]);
        exampleObject.insert("age",baseAge + i);
        exampleObject.insert("time",QDateTime::currentDateTime().toString());
 
        exampleArray.append(exampleObject);
    }
 
    // 向数组中放不同类型的jsonObject
    QJsonObject sizeJson;
    sizeJson.insert("size",exampleArray.size());
    exampleArray.append(sizeJson);
 
    // 将json数组放入json对象中
    QJsonObject jsonArrayObject;
    jsonArrayObject.insert("index:1",exampleArray);
 
    // 写入到打开的文档fileExample中
    QJsonDocument exampleJsonDoc;
    exampleJsonDoc.setObject(jsonArrayObject);
 
    fileExample.write(exampleJsonDoc.toJson());
    fileExample.close();
 
    qDebug() << "write fileExample to file done.";
    return a.exec();
}

JsonExample.json文件内容:

复制代码
{
    "index:1": [
        {
            "age": 20,
            "name": "tom",
            "time": "Fri Jul 9 10:30:34 2021"
        },
        {
            "age": 21,
            "name": "bob",
            "time": "Fri Jul 9 10:30:34 2021"
        },
        {
            "age": 22,
            "name": "lili",
            "time": "Fri Jul 9 10:30:34 2021"
        },
        {
            "size": 3
        }
    ]
}

3.数据读取

3.1 封装函数

读Json除会用到写时需要的类,还需要QJsonParseError用于在将文件数据转换为Json格式数据时的错误接收

为了多次读方便,封装一个通用的读JSON函数,提供给下面的例子使用:

复制代码
/**
 * outDoc:   保存解析结果。
 * fileName: 要解析的json文件名称
 * return:   成功:true, 失败: false
 */
bool readFile(QJsonDocument& outDoc, const QString& fileName)
{
    // 根据当前操作系统类型 设置字符集避免乱码
    //if(QSysInfo::productType() == "windows")
    // 打开json文件
    QFile jsonFIle( QDir::homePath() + "/" + fileName );
    if( !jsonFIle.open(QIODevice::ReadWrite))
    {
        qDebug() << "open file jsonObject.json error!";
        return false;
    }
 
    QJsonParseError jsonParserError;
    outDoc = QJsonDocument::fromJson(jsonFIle.readAll(),&jsonParserError);
 
    jsonFIle.close();
    // 文档不空 && jsonParserError解析没有错误,解析成功返回 true
    return (!outDoc.isNull() && (jsonParserError.error == QJsonParseError::NoError));
}

3.2 对象

解析文件内容:

复制代码
{
    "age": 18.5,
    "name": "tom",
    "time": "Fri Jul 9 13:39:03 2021"
}

代码:

复制代码
int readJson()
{
 
    QJsonDocument jsonDoc;
    if( !readFile(jsonDoc,"jsonObject.json"))
    {
        qDebug() << "read file error!";
        return 1;
    }
 
    if(jsonDoc.isObject())
    {
        QJsonObject jsonObject = jsonDoc.object();
        const QStringList&keys = jsonObject.keys();
        for(const QString& key : keys)
        {
            qDebug() << "key: " << key << " value: " << jsonObject.value(key) << "  isDouble: " << jsonObject.value(key).isDouble() << " isArray: " << jsonObject.value(key).isArray() << " isObject: " << jsonObject.value(key).isObject();
        }
    }
 
    return 0;
}

结果:

3.3 数组

解析文件内容:

复制代码
[
    "name",
    18,
    "Fri Jul 9 14:17:31 2021"
]

代码:

复制代码
int readJson()
{
 
    QJsonDocument jsonDoc;
    if( !readFile(jsonDoc,"jsonArray.json"))
    {
        qDebug() << "read file error!";
        return 1;
    }
 
    // QJsonArray
    if(jsonDoc.isArray())
    {
        QJsonArray jsonArray = jsonDoc.array();
        for(int i = 0; i < jsonArray.size(); ++i)
        {
            qDebug() << "index " << i + 1 << " :" << jsonArray.at(i);
        }
    }
 
    return 0;
}

结果:

3.4 对象与数组组合

解析文件内容:

( 文件结构:对象{ 数组 多个对象{},.... } )

复制代码
{
    "index:1": [
        {
            "age": 20,
            "name": "tom",
            "time": "Fri Jul 9 14:33:59 2021"
        },
        {
            "age": 21,
            "name": "bob",
            "time": "Fri Jul 9 14:33:59 2021"
        },
        {
            "age": 22,
            "name": "lili",
            "time": "Fri Jul 9 14:33:59 2021"
        },
        {
            "size": 3
        }
    ]
}

代码:

复制代码
int readJson()
{
 
    QJsonDocument jsonDoc;
    if( !readFile(jsonDoc,"jsonExample.json"))
    {
        qDebug() << "read file error!";
        return 1;
    }
 
    // QJsonObject + QJsonArray
    if(jsonDoc.isObject())
    {
        QJsonObject jsonObject = jsonDoc.object();
        const QStringList&keys = jsonObject.keys();
        for(const QString& key : keys)
        {
            if(jsonObject.value(key).isArray())
            {
                qDebug() << "key: " << key;
                QJsonArray jsonArray = jsonObject.value(key).toArray();
                for(int i = 0; i < jsonArray.size(); ++i)
                {
                    if(jsonArray.at(i).isObject())
                    {
                        QJsonObject arrayObject = jsonArray.at(i).toObject();
                        QStringList arrayObjectKeys = arrayObject.keys();
 
                        for(const QString& key : arrayObjectKeys)
                        {
                            qDebug() << "arrayObjKey :" << key << "  value :" << arrayObject.value(key);
                        }
 
                    }
                }
            }
        }
    }
 
    return 0;
}

结果:

代码优化

复制代码
// 1 解析Json文件
int parserJson();
// 2 解析对象的函数
void parserObject(const QJsonObject& jsonObject);
// 3 解析数组的函数
void parserArray(const QJsonArray& jsonArray);
 
int main()
{
    // 调用parserJson即可
    parserJson();
 
    return 0;
}
 
// 解析Json文件
int parserJson()
{
    QJsonDocument jsonDoc;
    if( !readFile(jsonDoc,"jsonExample.json"))
    {
        qDebug() << "read file error!";
        return 1;
    }
 
    if(jsonDoc.isObject())
    {
        QJsonObject jsonObject = jsonDoc.object();
        parserObject(jsonObject);
    }
 
    if(jsonDoc.isArray())
    {
        QJsonArray jsonArray = jsonDoc.array();
        parserArray(jsonArray);
    }
 
    return 0;
}
 
 
// 解析对象的函数
void parserObject(const QJsonObject& jsonObject)
{
    const QStringList&keys = jsonObject.keys();
    for(const QString& key : keys)
    {
        QJsonValue jsonValue = jsonObject.value(key);
        if(jsonValue.isArray())
        {
            parserArray(jsonValue.toArray());
        }
        else if(jsonValue.isObject())
        {
            parserObject(jsonValue.toObject());
        }
        else if( !jsonValue.isNull() && !jsonValue.isUndefined())
        {
            qDebug() << "key: " << key << "\tvalue:" << jsonValue;
        }
    }
}
 
// 解析数组的函数
void parserArray(const QJsonArray& jsonArray)
{
    for(int i = 0; i < jsonArray.size(); ++i)
    {
        QJsonValue jsonValue = jsonArray.at(i);
        if(jsonValue.isObject())
        {
            parserObject(jsonValue.toObject());
        }
        else if(jsonValue.isArray())
        {
            parserArray(jsonValue.toArray());
        }
        else if( !jsonValue.isNull() && !jsonValue.isUndefined())
        {
            qDebug() << "array value: " << jsonArray.at(i);
        }
    }
}

优化后的代码,可以对以上三种任何例子中的json文件解析。

相关推荐
施棠海1 小时前
自定义并可深度定制的数字滚动选择器完整源代码与相关注意事项
java·开发语言
z落落1 小时前
C# 索引器 this[]
开发语言·c#
csdn_aspnet1 小时前
C# List 移除某个属性值中最大的值
开发语言·c#·list
艾莉丝努力练剑1 小时前
【QT】窗口
运维·网络·数据库·qt·计算机网络·microsoft
xindon121 小时前
go语言项目部署的makefile
开发语言·后端·golang
老毛肚1 小时前
记一次逆向
开发语言·python
凯瑟琳.奥古斯特1 小时前
力扣1002题C++解法详解
开发语言·c++·算法·leetcode·职场和发展
雪的季节1 小时前
Qt 下 UDP 丢包解决方案 + TCP 粘包完美解决方案
qt·tcp/ip·udp