JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前端与后端之间的数据传输。它以简洁、易读的文本格式来表示结构化数据,通常由键值对(key-value pairs)组成,支持数组(array)和嵌套对象(nested objects)。JSON具有广泛的应用,特别在Web开发中被广泛使用。
JSON的语法规则简单明了,常见的数据类型包括字符串、数字、布尔值、null、数组和对象。它可以表示复杂的数据结构,并且易于解析和生成。JSON数据可以通过JavaScript的内置方法进行解析和处理,也可以在不同编程语言之间进行转换和传递。
JSON使用场景:配置文件、序列化、定义接口
JSON是存储和交换文本信息的语法,类似XML,它比XML更小、更快、更加容易解析
QJsonDocument类
QJsonDocument 是 Qt 框架中用于处理 JSON(JavaScript Object Notation)数据的类。它提供了一种方便的方式来创建、解析和操作 JSON 数据。
QJsonDocument是一个包含了完整JSON文档的类,支持以UTF-8编码的文本和QT自身的二进制格式来读写JSON文档。
创建 JSON 对象:使用 QJsonObject 类创建一个 JSON 对象,并将其添加到 QJsonDocument 中。
解析 JSON 字符串:通过调用 QJsonDocument::fromJson() 静态函数并传入 JSON 字符串,可以将其解析为 QJsonDocument 对象
将 JSON 对象转换为字符串:通过调用 QJsonDocument::toJson() 函数,可以将 QJsonDocument 对象转换为 JSON 字符串。
访问和修改 JSON 对象的值:通过访问 QJsonDocument 和 QJsonObject 的成员函数,可以读取和修改 JSON 对象中的键值对。
支持多种数据类型:QJsonDocument 可以处理各种类型的数据,包括字符串、整数、浮点数、布尔值、数组和嵌套对象等。
常用函数
c
QJsonDocument::fromJson(); //将 JSON 字符串解析为 QJsonDocument 对象。
QJsonDocument::fromVarient(); //将Varient类型解析为 QJsonDocument 对象
QJsonDocument::toJson(); //将 QJsonDocument 对象转换为 JSON 字符串。
QJsonDocument::object(); //获取表示 JSON 文档的顶层对象的 QJsonObject 对象
QJsonDocument::isArray(); //检查 QJsonDocument 是否表示一个 JSON 数组。
QJsonDocument::array(); //获取 QJsonDocument 中的 JSON 数组。
QJsonDocument::isEmpty(); //检查 QJsonDocument 是否为空。
QJsonDocument::isNull(); //检查 QJsonDocument 是否为 null。
QJsonObject
QJsonObject 是 Qt 中用于表示 JSON 对象的类。它提供了一组函数来操作和访问 JSON 对象的键值对。
常用函数
c
QJsonObject::insert(); //向 JSON 对象中插入一个键值对。
QJsonObject::contains(); //检查 JSON 对象中是否包含指定的键。
QJsonObject::value(); //获取指定键的值。
QJsonObject::keys(); //返回 JSON 对象中所有键的列表。
QJsonObject::remove(); //从 JSON 对象中删除指定的键及其对应的值。
QJsonObject::isEmpty(); //检查 JSON 对象是否为空。
QJsonValue
QJsonValue 是 Qt 中用于表示 JSON 值的类。它是一个通用的数据类型,可以表示 JSON 中的各种数据类型,包括字符串、数字、布尔值、数组、对象和 null 值。
常用函数
类型检测函数:
- bool isNull() const:检查值是否为 null。
- bool isBool() const:检查值是否为布尔类型。
- bool isDouble() const:检查值是否为双精度浮点数。
- bool isString() const:检查值是否为字符串。
- bool isArray() const:检查值是否为数组。
- bool isObject() const:检查值是否为对象。
获取值函数:
- double toDouble(bool *ok = nullptr) const:将值转换为双精度浮点数。
- QString toString() const:将值转换为字符串。
- bool toBool() const:将值转换为布尔值。
- int toInt() const:将值转换为整数。
- QJsonArray toArray() const:将值转换为数组。
- QJsonObject toObject() const:将值转换为对象。
其他常用函数:
- bool operator==(const QJsonValue &other) const:比较两个 QJsonValue 对象是否相等。
- QJsonValue operator[](int i) const:访问数组中的元素。
- QJsonValue operator[](const QString &key) const:访问对象中指定键对应的值。
数据写入JSON文件
c
#include<QFile>
#include<QJsonDocument> //JSON文档
#include<QJsonObject> //JSON对象
#include<QJsonParseError>//JSON异常捕获
//将数据信息写入JSON文件
void QJsonOpen::writeJson()
{
//1.创建JSON对象
QJsonObject mysqlinfo;
mysqlinfo.insert("ip","192.168.0.125");
mysqlinfo.insert("port",3308);
mysqlinfo.insert("user","root");
mysqlinfo.insert("password","123456");
QJsonObject jsoninfo;
jsoninfo.insert("code",1);
jsoninfo.insert("dbmsg","MYSQL数据库配置参数");
jsoninfo.insert("data",mysqlinfo);//将json对象作为Json对象插入的数据值
//2.创建Json文档
QJsonDocument jsondoc;
jsondoc.setObject(jsoninfo);
//3.创建文件
QFile qfile("./databasejsonfiles.json");
if(qfile.open(QIODevice::writeOnly))
{
qfile.write(jsondoc.toJson());
qfile.close();
}
//http发送json数据
QByteArray data = jsondoc.toJson();
qDebug() << "url:" << url << ",data:" << QString(data);
QNetworkReply *reply = m_manager->post(request, data);
}
//从QVarient读取数据
QMap<QString, QVariant> json;
json.insert("login", login);
json.insert("web_server", web_server);
QJsonDocument jsonDocument = QJsonDocument::fromVariant(json);
if (jsonDocument.isNull() == true) {
qDebug() << "QJsonDocument::fromVariant错误";
return;
}
从json文件读出数据
c
QString strjson;
QFile qfiles("./databasejsonfiles.json");
if(qfiles.open(QIODevice::ReadOnly))
{
strjson = qfiles.readAll();
qfiles.close();
}
QJsonParseError jsonerror;//返回JSON解析错误的时候,报告错误信息
QJsonDocument jsondoc = QJsonDocument::fromJson(strjson.toUtf8(),&jsonerror);
QString strtemp;
if(!jsondoc.isEmpty() && (jsonerror.error == QJsonParseError::NoError))
{
//只要jsondoc不为空,和jsonerror没有错误
//将他转换为JSON对象
QJsonObject json = jsondoc.object();
QJsonValue code = json.value("code");
QJsonValue data = json.value("data");
//检查数据
if(code.isUndefined() || code.toDouble() != 1 || data.isUndefined() || !data.isObject())
{
qDebug()<<"转换JSon数据错误,请重新检查!";
exit(100);
}
//如果没有错误,读取data数据信息
QJsonObject databaseinfo = data.toObject();
QJsonObject dbip = databaseinfo.value("ip");
QJsonObject dbport = databaseinfo.value("port");
}
c
//遍历json文档的键并查找匹配的键值对
QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(json, &err);
if (err.error == QJsonParseError::NoError) {
//没有出错
if (doc.isNull() || doc.isEmpty()) {
qDebug() << "doc is null or doc is empty";
return "";
}
if (doc.isObject()) {
QJsonObject rootObj = doc.object();
QJsonValue titleValue = rootObj.value(title);
if (titleValue.type() == QJsonValue::Object) {
QJsonObject titleObj = titleValue.toObject();
QStringList list = titleObj.keys();
for (int i=0;i<list.size();i++) {
QString keyTemp = list.at(i);
if (keyTemp == key) {
return titleObj.value(key).toString();
}
}
}
}
} else {
qDebug() << "err = " << err.errorString();
}