Qt Json

本文详细介绍了在Qt框架下如何使用QJsonDocument、QJsonObject、QJsonArray等类进行JSON数据的解析、创建和序列化,包括读取JSON文件、创建复杂的JSON对象以及将JSON数据保存到文件等关键步骤。
// 定义一个抽象接口类

#ifndef JSONBASE_H
#define JSONBASE_H

#include<QJsonObject>
class IJsonSerialize
{
   
   

public:
    IJsonSerialize() = default;
    virtual void read( QJsonObject &json) = 0;
    virtual void write( QJsonObject &json) = 0;
};


#endif // JSONBASE_H
// 要进行序列化的类,都继承于同样的接口
// 对于复杂字段都要继承并实现其read 和write

#ifndef CAMSETTINGS_H
#define CAMSETTINGS_H

#include<QObject>
#include<JsonBase.h>
#include<QString>


enum ActionType{
   
   Auto,Manual};
enum PixelFormat{
   
   JPEG,PNG,RAW};


class Exposure:public IJsonSerialize
{
   
   
   Q_GADGET;
public:
    Exposure() = default;

    void read( QJsonObject &json) override;
    void write( QJsonObject &json) override;


    ActionType Mode()const;
    void setMode(const ActionType type);

    int ISP() const;
    void setISP(const int i);

    int Time() const;
    void setTime(const int i);

private:
    ActionType  _mode;
    int         _isp;
    int         _time;
};


class CamSettings:public IJsonSerialize
{
   
   
    Q_GADGET;

public:
    CamSettings() =default;


    void read( QJsonObject &json) override;
    void write( QJsonObject &json) override;

    Exposure getExposure() const;
    void setExposure
Qt 引入了相关类来提供简洁、直观和高效的方式处理 JSON 数据,原因包括兼容性、易用性、性能和跨平台性等 [^1]。以下是关于 QtJSON 的使用方法及示例: ### 使用方法 - **解析 JSON 字符串**:使用 `QJsonDocument` 类来解析 JSON 字符串,生成 `QJsonObject` 或 `QJsonArray`,并且可以将它们序列化回 JSON 字符串 [^3]。 - **操作 JSON 数组**:`QJsonArray` 类封装了一个 JSON 数组,它是值的列表。可以通过在数组中插入和删除 `QJsonValue` 来操纵列表,还能与 `QVariantList` 相互转换。常用接口有 `size()`、`insert()`、`removeAt()`,也可使用标准 C++ 迭代器模式对其内容进行迭代 [^4]。 - **操作 JSON 对象**:`QJsonObject` 用于处理 JSON 对象。 ### 示例代码 #### 读取 JSON 文件并解析 ```cpp #include <QCoreApplication> #include <QFile> #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 打开 JSON 文件 QFile file("example.json"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open file"; return -1; } // 读取文件内容 QByteArray jsonData = file.readAll(); file.close(); // 解析 JSON 数据 QJsonParseError parseError; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "JSON parse error:" << parseError.errorString(); return -1; } // 获取 JSON 对象 QJsonObject jsonObj = jsonDoc.object(); // 访问 JSON 对象的属性 if (jsonObj.contains("name") && jsonObj["name"].isString()) { QString name = jsonObj["name"].toString(); qDebug() << "Name:" << name; } if (jsonObj.contains("age") && jsonObj["age"].isDouble()) { int age = jsonObj["age"].toInt(); qDebug() << "Age:" << age; } // 处理 JSON 数组 if (jsonObj.contains("hobbies") && jsonObj["hobbies"].isArray()) { QJsonArray hobbiesArray = jsonObj["hobbies"].toArray(); qDebug() << "Hobbies:"; for (const auto& hobbyValue : hobbiesArray) { if (hobbyValue.isString()) { QString hobby = hobbyValue.toString(); qDebug() << " - " << hobby; } } } return a.exec(); } ``` #### 写入 JSON 数据到文件 ```cpp #include <QCoreApplication> #include <QFile> #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建 JSON 对象 QJsonObject jsonObj; jsonObj["name"] = "John Doe"; jsonObj["age"] = 30; // 创建 JSON 数组 QJsonArray hobbiesArray; hobbiesArray.append("Reading"); hobbiesArray.append("Swimming"); hobbiesArray.append("Running"); // 将数组添加到 JSON 对象 jsonObj["hobbies"] = hobbiesArray; // 创建 JSON 文档 QJsonDocument jsonDoc(jsonObj); // 将 JSON 数据转换为字节数组 QByteArray jsonData = jsonDoc.toJson(); // 打开文件进行写入 QFile file("output.json"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "Failed to open file for writing"; return -1; } // 写入 JSON 数据到文件 file.write(jsonData); file.close(); qDebug() << "JSON data written to output.json"; return a.exec(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值