Json文件操作

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();
    }
相关推荐
zaim138 分钟前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
学习使我变快乐42 分钟前
C++:const成员
开发语言·c++
一律清风4 小时前
QT-文件创建时间修改器
c++·qt
不知所云,4 小时前
qt cmake自定义资源目录,手动加载资源(图片, qss文件)
开发语言·qt
风清扬_jd4 小时前
Chromium 如何定义一个chrome.settingsPrivate接口给前端调用c++
前端·c++·chrome
Death2005 小时前
Qt 6 相比 Qt 5 的主要提升与更新
开发语言·c++·qt·交互·数据可视化
机器视觉知识推荐、就业指导5 小时前
使用Qt实现实时数据动态绘制的折线图示例
开发语言·qt
麻辣韭菜7 小时前
网络基础 【HTTP】
网络·c++·http
阿史大杯茶7 小时前
Codeforces Round 976 (Div. 2 ABCDE题)视频讲解
数据结构·c++·算法
转调7 小时前
每日一练:地下城游戏
开发语言·c++·算法·leetcode