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();
    }
相关推荐
还债大湿兄4 小时前
《C++内存泄漏8大战场:Qt/MFC实战详解 + 面试高频陷阱破解》
c++·qt·mfc
u_topian7 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
珊瑚里的鱼8 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上8 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
Risehuxyc8 小时前
C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
开发语言·c++
飞虾哥10 小时前
QT tabWidget移除页面和隐藏表头
qt
景彡先生11 小时前
C++编译期计算:常量表达式(constexpr)全解析
服务器·c++
tan77º11 小时前
【Linux网络编程】应用层自定义协议与序列化
linux·运维·服务器·网络·c++·tcp/ip
悠哉清闲12 小时前
Android Studio C++/JNI/Kotlin 示例 三
c++·kotlin·android studio
AI迅剑12 小时前
模块三:现代C++工程实践(4篇)第二篇《性能调优:Profile驱动优化与汇编级分析》
汇编·c++