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();
    }
相关推荐
charlie11451419111 分钟前
深入理解C/C++的编译链接技术6——A2:动态库设计基础之ABI设计接口
c语言·开发语言·c++·学习·动态库·函数
Cx330❀14 分钟前
C++ STL set 完全指南:从基础用法到实战技巧
开发语言·数据结构·c++·算法·leetcode·面试
zmzb010319 分钟前
C++课后习题训练记录Day33
开发语言·c++
Want59538 分钟前
C/C++贪吃蛇小游戏
c语言·开发语言·c++
草莓熊Lotso2 小时前
《算法闯关指南:动态规划算法--斐波拉契数列模型》--01.第N个泰波拉契数,02.三步问题
开发语言·c++·经验分享·笔记·其他·算法·动态规划
草莓熊Lotso2 小时前
Git 分支管理:从基础操作到协作流程(本地篇)
大数据·服务器·开发语言·c++·人工智能·git·sql
报错小能手3 小时前
C++异常处理 终极及总结
开发语言·c++
Algo-hx3 小时前
C++编程基础(九):预处理指令
c++
凌康ACG10 小时前
Sciter之c++与前端交互(五)
c++·sciter
郝学胜-神的一滴12 小时前
Linux命名管道:创建与原理详解
linux·运维·服务器·开发语言·c++·程序人生·个人开发