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);
}