QT json文件

QT/qt(16)json文件

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,

同时也易于机器解析和生成。

JSON 采用完全独立于语言的文本格式,

但也使用了类似于 C 语言家族的习惯(包括 C、C++、C#、Java、JavaScript、Perl、Python 等)。

这些特性使得 JSON 成为理想的数据交换语言。

JSON 数据结构主要有两种:

1. 对象(Object): 对象是一个无序的键值对集合。键必须是字符串,值可以是字符串、数字、对象、数组、布尔值或 null。
    {
        "name": "John",
        "age": 30,
        "city": "New York"
    }

2. 数组(Array): 数组是一个有序的值集合。值可以是字符串、数字、对象、数组、布尔值或 null。
    
    [
        "apple",
        123,
        true,
        null,
        {
            "name": "John",
            "age": 30
        }
    ]


JSON 数据类型

JSON 支持以下数据类型:

字符串(String):用双引号括起来的字符序列。
    "Hello, World!"
    
数字(Number):整数或浮点数。
    123

布尔值(Boolean):true 或 false。
    true

对象(Object):无序的键值对集合。
    {
        "name": "John",
        "age": 30
    }

数组(Array):有序的值集合。
    [1, 2, 3, 4, 5]

null:表示空值。
    null


QJsonDocument 类

QJsonDocument 类是用来表示 JSON 文档的类。
它提供了读取、写入和操作 JSON 数据的功能。

class QJsonDocument {
public:
    // 构造函数
    QJsonDocument(); // 默认构造函数,创建一个空的 JSON 文档
    QJsonDocument(const QJsonDocument &other); // 拷贝构造函数
    QJsonDocument(const QJsonObject &object); // 从 QJsonObject 构造 JSON 文档
    QJsonDocument(const QJsonArray &array); // 从 QJsonArray 构造 JSON 文档

    // 析构函数
    ~QJsonDocument();

    // 公共成员函数
    QJsonDocument &operator=(const QJsonDocument &other); // 赋值运算符
    void swap(QJsonDocument &other) noexcept; // 交换函数
    bool operator==(const QJsonDocument &other) const; // 相等运算符
    bool operator!=(const QJsonDocument &other) const; // 不等运算符
    bool isEmpty() const; // 检查文档是否为空
    bool isArray() const; // 检查文档是否为数组
    bool isObject() const; // 检查文档是否为对象
    QJsonArray array() const; // 返回文档的数组
    QJsonObject object() const; // 返回文档的对象
    void setArray(const QJsonArray &array); // 设置文档为数组
    void setObject(const QJsonObject &object); // 设置文档为对象
    QByteArray toJson(QJsonDocument::JsonFormat format = Indented) const; // 将文档转换为 JSON 字节数组
    QString toJson(QJsonDocument::JsonFormat format = Indented) const; // 将文档转换为 JSON 字符串
    bool isNull() const; // 检查文档是否为 null

    // 静态成员函数
    static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = nullptr); // 从 JSON 字节数组创建文档
    static QJsonDocument fromVariant(const QVariant &variant); // 从 QVariant 创建文档

    // 枚举类型
    enum JsonFormat {
        Indented, // 格式化输出
        Compact // 紧凑输出
    };
};

QJsonObject 类

QJsonObject 类是用来表示 JSON 对象(Object)的类。
JSON 对象是一个无序的键值对集合,其中键是字符串,值可以是字符串、数字、对象、数组、布尔值或 null。QJsonObject 提供了读取、写入和操作 JSON 对象的功能。

class QJsonObject {
public:
    // 构造函数
    QJsonObject(); // 默认构造函数,创建一个空的 JSON 对象
    QJsonObject(const QJsonObject &other); // 拷贝构造函数

    // 析构函数
    ~QJsonObject();

    // 公共成员函数
    QJsonObject &operator=(const QJsonObject &other); // 赋值运算符
    void swap(QJsonObject &other) noexcept; // 交换函数
    bool operator==(const QJsonObject &other) const; // 相等运算符
    bool operator!=(const QJsonObject &other) const; // 不等运算符
    int size() const; // 返回对象中键值对的数量
    bool isEmpty() const; // 检查对象是否为空
    QStringList keys() const; // 返回对象中所有键的列表
    int count() const; // 返回对象中键值对的数量
    bool contains(const QString &key) const; // 检查对象是否包含指定的键
    void detach(); // 分离对象(用于内部优化)
    bool isDetached() const; // 检查对象是否已分离
    void clear(); // 清空对象中的所有键值对
    bool remove(const QString &key); // 移除指定键的键值对
    QJsonValue take(const QString &key); // 移除并返回指定键的值
    QJsonValue value(const QString &key) const; // 返回指定键的值
    QJsonValue operator[](const QString &key) const; // 返回指定键的值(数组访问运算符)
    QJsonValueRef operator[](const QString &key); // 返回指定键的值引用(可用于修改)
    void insert(const QString &key, const QJsonValue &value); // 插入或替换键值对

    // 迭代器
    typedef QJsonObject::const_iterator const_iterator; // 常量迭代器
    typedef QJsonObject::iterator iterator; // 非常量迭代器
    const_iterator constBegin() const; // 返回常量开始迭代器
    const_iterator constEnd() const; // 返回常量结束迭代器
    iterator begin(); // 返回开始迭代器
    const_iterator begin() const; // 返回常量开始迭代器
    iterator end(); // 返回结束迭代器
    const_iterator end() const; // 返回常量结束迭代器

    // 静态成员函数
    static QJsonObject fromVariantMap(const QVariantMap &map); // 从 QVariantMap 创建 JSON 对象
    static QVariantMap toVariantMap(const QJsonObject &object); // 将 JSON 对象转换为 QVariantMap
};

QJsonArray 类

QJsonArray 提供了读取、写入和操作 JSON 数组的功能。

class QJsonArray {
public:
    // 构造函数
    QJsonArray(); // 默认构造函数,创建一个空的 JSON 数组
    QJsonArray(const QJsonArray &other); // 拷贝构造函数

    // 析构函数
    ~QJsonArray();

    // 公共成员函数
    QJsonArray &operator=(const QJsonArray &other); // 赋值运算符
    void swap(QJsonArray &other) noexcept; // 交换函数
    bool operator==(const QJsonArray &other) const; // 相等运算符
    bool operator!=(const QJsonArray &other) const; // 不等运算符
    int size() const; // 返回数组中元素的数量
    bool isEmpty() const; // 检查数组是否为空
    int count() const; // 返回数组中元素的数量
    void detach(); // 分离数组(用于内部优化)
    bool isDetached() const; // 检查数组是否已分离
    void clear(); // 清空数组中的所有元素
    bool removeAt(int i); // 移除指定索引的元素
    QJsonValue takeAt(int i); // 移除并返回指定索引的元素
    QJsonValue at(int i) const; // 返回指定索引的元素
    QJsonValue operator[](int i) const; // 返回指定索引的元素(数组访问运算符)
    QJsonValueRef operator[](int i); // 返回指定索引的元素引用(可用于修改)
    void append(const QJsonValue &value); // 在数组末尾添加元素
    void prepend(const QJsonValue &value); // 在数组开头添加元素
    void insert(int i, const QJsonValue &value); // 在指定索引插入元素

    // 迭代器
    typedef QJsonArray::const_iterator const_iterator; // 常量迭代器
    typedef QJsonArray::iterator iterator; // 非常量迭代器
    const_iterator constBegin() const; // 返回常量开始迭代器
    const_iterator constEnd() const; // 返回常量结束迭代器
    iterator begin(); // 返回开始迭代器
    const_iterator begin() const; // 返回常量开始迭代器
    iterator end(); // 返回结束迭代器
    const_iterator end() const; // 返回常量结束迭代器

    // 静态成员函数
    static QJsonArray fromStringList(const QStringList &list); // 从 QStringList 创建 JSON 数组
    static QJsonArray fromVariantList(const QVariantList &list); // 从 QVariantList 创建 JSON 数组
    static QStringList toStringList(const QJsonArray &array); // 将 JSON 数组转换为 QStringList
    static QVariantList toVariantList(const QJsonArray &array); // 将 JSON 数组转换为 QVariantList
};

QJsonParseError 类

QJsonParseError 类表示 JSON 解析错误。
当使用 QJsonDocument::fromJson 方法解析 JSON 数据时,如果解析失败,可以通过 QJsonParseError 对象获取详细的错误信息。

class QJsonParseError {
public:
    // 构造函数
    QJsonParseError(); // 默认构造函数

    // 公共成员函数
    QString errorString() const; // 返回错误描述字符串

    // 枚举类型
    enum ParseError {
        NoError, // 无错误
        UnterminatedObject, // 对象未结束
        MissingNameSeparator, // 缺少名称分隔符
        UnterminatedArray, // 数组未结束
        MissingValueSeparator, // 缺少值分隔符
        IllegalValue, // 非法值
        TerminationByNumber, // 数字终止
        IllegalNumber, // 非法数字
        IllegalEscapeSequence, // 非法转义序列
        IllegalUTF8String, // 非法 UTF-8 字符串
        UnterminatedString, // 字符串未结束
        MissingObject, // 缺少对象
        DeepNesting, // 深度嵌套
        DocumentTooLarge, // 文档太大
        GarbageAtEnd // 结尾有垃圾数据
    };

    // 公共成员变量
    ParseError error; // 错误类型
    int offset; // 错误发生的位置偏移量
};

示例

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QFile>
#include <QJsonDocument>//功能:解析json字符串
#include <QJsonObject>//功能:操作json对象
#include <QJsonArray>//功能:操作json数组
#include <QJsonParseError>//功能:json解析错误


QT_BEGIN_NAMESPACE
namespace Ui {
class Dialog;
}
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private slots:
    void on_WJSONButton_clicked();

    void on_RJSONButton_clicked();

private:
    Ui::Dialog *ui;
};
#endif // DIALOG_H


#include <QMessageBox>
#include "dialog.h"
#include "./ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}
//写入json
void Dialog::on_WJSONButton_clicked()
{
    QJsonObject myObject;//创建一个json对象
    myObject.insert("name", "John");//插入键值对
    myObject.insert("age", 30);//插入键值对
    myObject.insert("city", "New York");//插入键值对
    //嵌套json对象

    QJsonObject addressObject;
    addressObject.insert("street", "123 Main St");
    addressObject.insert("city", "New York");
    addressObject.insert("state", "NY");
    myObject.insert("address", addressObject);//插入键值对



    QJsonDocument doc(myObject);//创建一个json文档
    QByteArray byteArr = doc.toJson(QJsonDocument::Compact);//将json文档转换为字节数组
    QFile file("myfile.json");//创建一个json文件
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))//打开文件
    {
        qDebug() << "Failed to open file";
        return;
    }
    file.write(byteArr);//写入字节数组
    file.close();//关闭文件


}

//读取json

void Dialog::on_RJSONButton_clicked()
{
    QFile file("myfile.json"); // 创建一个json文件
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) // 打开文件
    {
        qDebug() << "Failed to open file";
        QMessageBox::critical(this, "Error", "Failed to open file.");
        return;
    }

    QByteArray byteArr = file.readAll(); // 读取字节数组
    file.close(); // 关闭文件

    QJsonParseError parseError;//创建一个解析错误对象
    QJsonDocument doc = QJsonDocument::fromJson(byteArr, &parseError); // 将字节数组转换为json文档,并捕获解析错误

    if (parseError.error != QJsonParseError::NoError) // 解析错误
    {
        qDebug() << "无法解析 JSON:" << parseError.errorString();
        QMessageBox::critical(this, "Error", "无法解析 JSON: " + parseError.errorString());
        return;
    }

    if (!doc.isObject()) // 不是json对象
    {
        qDebug() << "JSON is not an object";
        QMessageBox::critical(this, "Error", "JSON is not an object.");
        return;
    }

    QJsonObject myObject = doc.object(); // 获取json对象

    // 读取json对象的值
    QString name = myObject.value("name").toString();
    int age = myObject.value("age").toInt();
    QString city = myObject.value("city").toString();

    if (!myObject.contains("address") || !myObject.value("address").isObject())// 地址对象不存在或不是json对象
    {
        qDebug() << "地址对象无效";
        QMessageBox::critical(this, "Error", "地址对象无效.");
        return;
    }

    QJsonObject addressObject = myObject.value("address").toObject();
    QString street = addressObject.value("street").toString();
    QString state = addressObject.value("state").toString();
    QString addresscity = addressObject.value("city").toString();

    // 弹窗显示json对象的值
    QMessageBox::information(this,
                             "JSON Object",
                             "Name: " + name + "\nAge: " + QString::number(age) + "\nCity: " + city + "\nAddress: " + street + ", " + state + ", " + addresscity);






}

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

可能只会写BUG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值